From 678f9da4acf7ffad4fb803ebcde0e9b6b2dd5b6e Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 20 Sep 2022 10:11:55 +0800 Subject: [PATCH 001/143] refact compress code --- include/util/tcompression.h | 340 ++++----------------------------- source/util/src/tcompression.c | 275 +++++++++++++++++++++++++- 2 files changed, 313 insertions(+), 302 deletions(-) diff --git a/include/util/tcompression.h b/include/util/tcompression.h index d7ba4dfa3f..5196c01fc6 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -51,287 +51,12 @@ extern "C" { #define HEAD_MODE(x) x % 2 #define HEAD_ALGO(x) x / 2 -extern int32_t tsCompressINTImp(const char *const input, const int32_t nelements, char *const output, const char type); -extern int32_t tsDecompressINTImp(const char *const input, const int32_t nelements, char *const output, - const char type); -extern int32_t tsCompressBoolImp(const char *const input, const int32_t nelements, char *const output); -extern int32_t tsDecompressBoolImp(const char *const input, const int32_t nelements, char *const output); -extern int32_t tsCompressStringImp(const char *const input, int32_t inputSize, char *const output, int32_t outputSize); -extern int32_t tsDecompressStringImp(const char *const input, int32_t compressedSize, char *const output, - int32_t outputSize); -extern int32_t tsCompressTimestampImp(const char *const input, const int32_t nelements, char *const output); -extern int32_t tsDecompressTimestampImp(const char *const input, const int32_t nelements, char *const output); -extern int32_t tsCompressDoubleImp(const char *const input, const int32_t nelements, char *const output); -extern int32_t tsDecompressDoubleImp(const char *const input, const int32_t nelements, char *const output); -extern int32_t tsCompressFloatImp(const char *const input, const int32_t nelements, char *const output); -extern int32_t tsDecompressFloatImp(const char *const input, const int32_t nelements, char *const output); -// lossy -extern int32_t tsCompressFloatLossyImp(const char *input, const int32_t nelements, char *const output); -extern int32_t tsDecompressFloatLossyImp(const char *input, int32_t compressedSize, const int32_t nelements, - char *const output); -extern int32_t tsCompressDoubleLossyImp(const char *input, const int32_t nelements, char *const output); -extern int32_t tsDecompressDoubleLossyImp(const char *input, int32_t compressedSize, const int32_t nelements, - char *const output); - #ifdef TD_TSZ extern bool lossyFloat; extern bool lossyDouble; int32_t tsCompressInit(); void tsCompressExit(); -#endif -static FORCE_INLINE int32_t tsCompressTinyint(const char *const input, int32_t inputSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, - char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_TINYINT); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_TINYINT); - return tsCompressStringImp(buffer, len, output, outputSize); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsDecompressTinyint(const char *const input, int32_t compressedSize, - const int32_t nelements, char *const output, int32_t outputSize, - char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_TINYINT); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_TINYINT); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsCompressSmallint(const char *const input, int32_t inputSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, - char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_SMALLINT); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_SMALLINT); - return tsCompressStringImp(buffer, len, output, outputSize); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsDecompressSmallint(const char *const input, int32_t compressedSize, - const int32_t nelements, char *const output, int32_t outputSize, - char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_SMALLINT); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_SMALLINT); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsCompressInt(const char *const input, int32_t inputSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_INT); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_INT); - return tsCompressStringImp(buffer, len, output, outputSize); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsDecompressInt(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_INT); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_INT); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsCompressBigint(const char *const input, int32_t inputSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_BIGINT); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_BIGINT); - return tsCompressStringImp(buffer, len, output, outputSize); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsDecompressBigint(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, - char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_BIGINT); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_BIGINT); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsCompressBool(const char *const input, int32_t inputSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressBoolImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressBoolImp(input, nelements, buffer); - return tsCompressStringImp(buffer, len, output, outputSize); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsDecompressBool(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressBoolImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressBoolImp(buffer, nelements, output); - } else { - assert(0); - return -1; - } -} - -static FORCE_INLINE int32_t tsCompressString(const char *const input, int32_t inputSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { - return tsCompressStringImp(input, inputSize, output, outputSize); -} - -static FORCE_INLINE int32_t tsDecompressString(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, - char *const buffer, int32_t bufferSize) { - return tsDecompressStringImp(input, compressedSize, output, outputSize); -} - -static FORCE_INLINE int32_t tsCompressFloat(const char *const input, int32_t inputSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { -#ifdef TD_TSZ - // lossy mode - if (lossyFloat) { - return tsCompressFloatLossyImp(input, nelements, output); - // lossless mode - } else { -#endif - if (algorithm == ONE_STAGE_COMP) { - return tsCompressFloatImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressFloatImp(input, nelements, buffer); - return tsCompressStringImp(buffer, len, output, outputSize); - } else { - assert(0); - return -1; - } -#ifdef TD_TSZ - } -#endif -} - -static FORCE_INLINE int32_t tsDecompressFloat(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, - char *const buffer, int32_t bufferSize) { -#ifdef TD_TSZ - if (HEAD_ALGO(input[0]) == ALGO_SZ_LOSSY) { - // decompress lossy - return tsDecompressFloatLossyImp(input, compressedSize, nelements, output); - } else { -#endif - // decompress lossless - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressFloatImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressFloatImp(buffer, nelements, output); - } else { - assert(0); - return -1; - } -#ifdef TD_TSZ - } -#endif -} - -static FORCE_INLINE int32_t tsCompressDouble(const char *const input, int32_t inputSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { -#ifdef TD_TSZ - if (lossyDouble) { - // lossy mode - return tsCompressDoubleLossyImp(input, nelements, output); - } else { -#endif - // lossless mode - if (algorithm == ONE_STAGE_COMP) { - return tsCompressDoubleImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressDoubleImp(input, nelements, buffer); - return tsCompressStringImp(buffer, len, output, outputSize); - } else { - assert(0); - return -1; - } -#ifdef TD_TSZ - } -#endif -} - -static FORCE_INLINE int32_t tsDecompressDouble(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, - char *const buffer, int32_t bufferSize) { -#ifdef TD_TSZ - if (HEAD_ALGO(input[0]) == ALGO_SZ_LOSSY) { - // decompress lossy - return tsDecompressDoubleLossyImp(input, compressedSize, nelements, output); - } else { -#endif - // decompress lossless - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressDoubleImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressDoubleImp(buffer, nelements, output); - } else { - assert(0); - return -1; - } -#ifdef TD_TSZ - } -#endif -} - -#ifdef TD_TSZ -// -// lossy float double -// static FORCE_INLINE int32_t tsCompressFloatLossy(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { @@ -358,33 +83,46 @@ static FORCE_INLINE int32_t tsDecompressDoubleLossy(const char *const input, int #endif -static FORCE_INLINE int32_t tsCompressTimestamp(const char *const input, int32_t inputSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, - char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressTimestampImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressTimestampImp(input, nelements, buffer); - return tsCompressStringImp(buffer, len, output, outputSize); - } else { - assert(0); - return -1; - } -} +int32_t tsCompressTimestamp(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -static FORCE_INLINE int32_t tsDecompressTimestamp(const char *const input, int32_t compressedSize, - const int32_t nelements, char *const output, int32_t outputSize, - char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressTimestampImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressTimestampImp(buffer, nelements, output); - } else { - assert(0); - return -1; - } -} +int32_t tsDecompressTimestamp(const char *const input, int32_t compressedSize, const int32_t nelements, + char *const output, int32_t outputSize, char algorithm, char *const buffer, + int32_t bufferSize); +int32_t tsCompressFloat(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsDecompressFloat(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsCompressDouble(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsDecompressDouble(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsCompressString(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsDecompressString(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsCompressBool(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsDecompressBool(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsCompressTinyint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsDecompressTinyint(const char *const input, int32_t compressedSize, const int32_t nelements, + char *const output, int32_t outputSize, char algorithm, char *const buffer, + int32_t bufferSize); +int32_t tsCompressSmallint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsDecompressSmallint(const char *const input, int32_t compressedSize, const int32_t nelements, + char *const output, int32_t outputSize, char algorithm, char *const buffer, + int32_t bufferSize); +int32_t tsCompressInt(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsDecompressInt(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsCompressBigint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsDecompressBigint(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); #ifdef __cplusplus } diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 62b9d87628..1128c51f9b 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1612,4 +1612,277 @@ int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int64_t *nData) int32_t tCompress(SCompressor *pCmprsor, const void *pData, int64_t nData) { return DATA_TYPE_INFO[pCmprsor->type].cmprFn(pCmprsor, pData, nData); -} \ No newline at end of file +} + +/************************************************************************* + * REGULAR COMPRESSION + *************************************************************************/ +// Timestamp ===================================================== +int32_t tsCompressTimestamp(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsCompressTimestampImp(input, nelements, output); + } else if (algorithm == TWO_STAGE_COMP) { + int32_t len = tsCompressTimestampImp(input, nelements, buffer); + return tsCompressStringImp(buffer, len, output, outputSize); + } else { + assert(0); + return -1; + } +} + +int32_t tsDecompressTimestamp(const char *const input, int32_t compressedSize, const int32_t nelements, + char *const output, int32_t outputSize, char algorithm, char *const buffer, + int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsDecompressTimestampImp(input, nelements, output); + } else if (algorithm == TWO_STAGE_COMP) { + if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; + return tsDecompressTimestampImp(buffer, nelements, output); + } else { + assert(0); + return -1; + } +} + +// Float ===================================================== +int32_t tsCompressFloat(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { +#ifdef TD_TSZ + // lossy mode + if (lossyFloat) { + return tsCompressFloatLossyImp(input, nelements, output); + // lossless mode + } else { +#endif + if (algorithm == ONE_STAGE_COMP) { + return tsCompressFloatImp(input, nelements, output); + } else if (algorithm == TWO_STAGE_COMP) { + int32_t len = tsCompressFloatImp(input, nelements, buffer); + return tsCompressStringImp(buffer, len, output, outputSize); + } else { + assert(0); + return -1; + } +#ifdef TD_TSZ + } +#endif +} + +int32_t tsDecompressFloat(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { +#ifdef TD_TSZ + if (HEAD_ALGO(input[0]) == ALGO_SZ_LOSSY) { + // decompress lossy + return tsDecompressFloatLossyImp(input, compressedSize, nelements, output); + } else { +#endif + // decompress lossless + if (algorithm == ONE_STAGE_COMP) { + return tsDecompressFloatImp(input, nelements, output); + } else if (algorithm == TWO_STAGE_COMP) { + if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; + return tsDecompressFloatImp(buffer, nelements, output); + } else { + assert(0); + return -1; + } +#ifdef TD_TSZ + } +#endif +} + +// Double ===================================================== +int32_t tsCompressDouble(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { +#ifdef TD_TSZ + if (lossyDouble) { + // lossy mode + return tsCompressDoubleLossyImp(input, nelements, output); + } else { +#endif + // lossless mode + if (algorithm == ONE_STAGE_COMP) { + return tsCompressDoubleImp(input, nelements, output); + } else if (algorithm == TWO_STAGE_COMP) { + int32_t len = tsCompressDoubleImp(input, nelements, buffer); + return tsCompressStringImp(buffer, len, output, outputSize); + } else { + assert(0); + return -1; + } +#ifdef TD_TSZ + } +#endif +} + +int32_t tsDecompressDouble(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { +#ifdef TD_TSZ + if (HEAD_ALGO(input[0]) == ALGO_SZ_LOSSY) { + // decompress lossy + return tsDecompressDoubleLossyImp(input, compressedSize, nelements, output); + } else { +#endif + // decompress lossless + if (algorithm == ONE_STAGE_COMP) { + return tsDecompressDoubleImp(input, nelements, output); + } else if (algorithm == TWO_STAGE_COMP) { + if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; + return tsDecompressDoubleImp(buffer, nelements, output); + } else { + assert(0); + return -1; + } +#ifdef TD_TSZ + } +#endif +} + +// Binary ===================================================== +int32_t tsCompressString(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + return tsCompressStringImp(input, inputSize, output, outputSize); +} + +int32_t tsDecompressString(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + return tsDecompressStringImp(input, compressedSize, output, outputSize); +} + +// Bool ===================================================== +int32_t tsCompressBool(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsCompressBoolImp(input, nelements, output); + } else if (algorithm == TWO_STAGE_COMP) { + int32_t len = tsCompressBoolImp(input, nelements, buffer); + return tsCompressStringImp(buffer, len, output, outputSize); + } else { + assert(0); + return -1; + } +} + +int32_t tsDecompressBool(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsDecompressBoolImp(input, nelements, output); + } else if (algorithm == TWO_STAGE_COMP) { + if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; + return tsDecompressBoolImp(buffer, nelements, output); + } else { + assert(0); + return -1; + } +} + +// Tinyint ===================================================== +int32_t tsCompressTinyint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_TINYINT); + } else if (algorithm == TWO_STAGE_COMP) { + int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_TINYINT); + return tsCompressStringImp(buffer, len, output, outputSize); + } else { + assert(0); + return -1; + } +} + +int32_t tsDecompressTinyint(const char *const input, int32_t compressedSize, const int32_t nelements, + char *const output, int32_t outputSize, char algorithm, char *const buffer, + int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_TINYINT); + } else if (algorithm == TWO_STAGE_COMP) { + if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; + return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_TINYINT); + } else { + assert(0); + return -1; + } +} + +// Smallint ===================================================== +int32_t tsCompressSmallint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_SMALLINT); + } else if (algorithm == TWO_STAGE_COMP) { + int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_SMALLINT); + return tsCompressStringImp(buffer, len, output, outputSize); + } else { + assert(0); + return -1; + } +} + +int32_t tsDecompressSmallint(const char *const input, int32_t compressedSize, const int32_t nelements, + char *const output, int32_t outputSize, char algorithm, char *const buffer, + int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_SMALLINT); + } else if (algorithm == TWO_STAGE_COMP) { + if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; + return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_SMALLINT); + } else { + assert(0); + return -1; + } +} + +// Int ===================================================== +int32_t tsCompressInt(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_INT); + } else if (algorithm == TWO_STAGE_COMP) { + int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_INT); + return tsCompressStringImp(buffer, len, output, outputSize); + } else { + assert(0); + return -1; + } +} + +int32_t tsDecompressInt(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_INT); + } else if (algorithm == TWO_STAGE_COMP) { + if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; + return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_INT); + } else { + assert(0); + return -1; + } +} + +// Bigint ===================================================== +int32_t tsCompressBigint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_BIGINT); + } else if (algorithm == TWO_STAGE_COMP) { + int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_BIGINT); + return tsCompressStringImp(buffer, len, output, outputSize); + } else { + assert(0); + return -1; + } +} + +int32_t tsDecompressBigint(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, + int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { + if (algorithm == ONE_STAGE_COMP) { + return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_BIGINT); + } else if (algorithm == TWO_STAGE_COMP) { + if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; + return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_BIGINT); + } else { + assert(0); + return -1; + } +} From 215883ea643d43392991380a24fcd4d6fd7e1607 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 20 Sep 2022 11:08:46 +0800 Subject: [PATCH 002/143] refact code --- include/common/ttypes.h | 9 +- include/util/tcompression.h | 76 +++++----- source/util/src/tcompression.c | 249 ++++++++++++++++----------------- 3 files changed, 163 insertions(+), 171 deletions(-) diff --git a/include/common/ttypes.h b/include/common/ttypes.h index a88f65f6ac..14e9a5af87 100644 --- a/include/common/ttypes.h +++ b/include/common/ttypes.h @@ -333,10 +333,10 @@ typedef struct tDataTypeDescriptor { char *name; int64_t minValue; int64_t maxValue; - int32_t (*compFunc)(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); - int32_t (*decompFunc)(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); + int32_t (*compFunc)(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); + int32_t (*decompFunc)(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); void (*statisFunc)(int8_t bitmapMode, const void *pBitmap, const void *pData, int32_t numofrow, int64_t *min, int64_t *max, int64_t *sum, int16_t *minindex, int16_t *maxindex, int16_t *numofnull); } tDataTypeDescriptor; @@ -356,7 +356,6 @@ void operateVal(void *dst, void *s1, void *s2, int32_t optr, int32_t type); void *getDataMin(int32_t type); void *getDataMax(int32_t type); - #ifdef __cplusplus } #endif diff --git a/include/util/tcompression.h b/include/util/tcompression.h index 5196c01fc6..b620615ab1 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -83,46 +83,42 @@ static FORCE_INLINE int32_t tsDecompressDoubleLossy(const char *const input, int #endif -int32_t tsCompressTimestamp(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); - -int32_t tsDecompressTimestamp(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize); -int32_t tsCompressFloat(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsDecompressFloat(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsCompressDouble(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsDecompressDouble(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsCompressString(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsDecompressString(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsCompressBool(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsDecompressBool(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsCompressTinyint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsDecompressTinyint(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize); -int32_t tsCompressSmallint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsDecompressSmallint(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize); -int32_t tsCompressInt(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsDecompressInt(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsCompressBigint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); -int32_t tsDecompressBigint(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize); +int32_t tsCompressTimestamp(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsDecompressTimestamp(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, + void *pBuf, int32_t nBuf); +int32_t tsCompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsDecompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsCompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsDecompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsCompressString(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsDecompressString(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsCompressBool(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsDecompressBool(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsCompressTinyint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsDecompressTinyint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsCompressSmallint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsDecompressSmallint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, + void *pBuf, int32_t nBuf); +int32_t tsCompressInt(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsDecompressInt(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsCompressBigint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); +int32_t tsDecompressBigint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf); #ifdef __cplusplus } diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 1128c51f9b..30b72f6fbe 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1618,27 +1618,26 @@ int32_t tCompress(SCompressor *pCmprsor, const void *pData, int64_t nData) { * REGULAR COMPRESSION *************************************************************************/ // Timestamp ===================================================== -int32_t tsCompressTimestamp(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressTimestampImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressTimestampImp(input, nelements, buffer); - return tsCompressStringImp(buffer, len, output, outputSize); +int32_t tsCompressTimestamp(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsCompressTimestampImp(pIn, nEle, pOut); + } else if (cmprAlg == TWO_STAGE_COMP) { + int32_t len = tsCompressTimestampImp(pIn, nEle, pBuf); + return tsCompressStringImp(pBuf, len, pOut, nOut); } else { assert(0); return -1; } } -int32_t tsDecompressTimestamp(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressTimestampImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressTimestampImp(buffer, nelements, output); +int32_t tsDecompressTimestamp(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, + void *pBuf, int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsDecompressTimestampImp(pIn, nEle, pOut); + } else if (cmprAlg == TWO_STAGE_COMP) { + if (tsDecompressStringImp(pIn, nIn, pBuf, nBuf) < 0) return -1; + return tsDecompressTimestampImp(pBuf, nEle, pOut); } else { assert(0); return -1; @@ -1646,20 +1645,20 @@ int32_t tsDecompressTimestamp(const char *const input, int32_t compressedSize, c } // Float ===================================================== -int32_t tsCompressFloat(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { +int32_t tsCompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { #ifdef TD_TSZ // lossy mode if (lossyFloat) { - return tsCompressFloatLossyImp(input, nelements, output); + return tsCompressFloatLossyImp(pIn, nEle, pOut); // lossless mode } else { #endif - if (algorithm == ONE_STAGE_COMP) { - return tsCompressFloatImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressFloatImp(input, nelements, buffer); - return tsCompressStringImp(buffer, len, output, outputSize); + if (cmprAlg == ONE_STAGE_COMP) { + return tsCompressFloatImp(pIn, nEle, pOut); + } else if (cmprAlg == TWO_STAGE_COMP) { + int32_t len = tsCompressFloatImp(pIn, nEle, pBuf); + return tsCompressStringImp(pBuf, len, pOut, nOut); } else { assert(0); return -1; @@ -1669,20 +1668,20 @@ int32_t tsCompressFloat(const char *const input, int32_t inputSize, const int32_ #endif } -int32_t tsDecompressFloat(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { +int32_t tsDecompressFloat(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { #ifdef TD_TSZ - if (HEAD_ALGO(input[0]) == ALGO_SZ_LOSSY) { + if (HEAD_ALGO(pIn[0]) == ALGO_SZ_LOSSY) { // decompress lossy - return tsDecompressFloatLossyImp(input, compressedSize, nelements, output); + return tsDecompressFloatLossyImp(pIn, nIn, nEle, pOut); } else { #endif // decompress lossless - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressFloatImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressFloatImp(buffer, nelements, output); + if (cmprAlg == ONE_STAGE_COMP) { + return tsDecompressFloatImp(pIn, nEle, pOut); + } else if (cmprAlg == TWO_STAGE_COMP) { + if (tsDecompressStringImp(pIn, nIn, pBuf, nBuf) < 0) return -1; + return tsDecompressFloatImp(pBuf, nEle, pOut); } else { assert(0); return -1; @@ -1693,20 +1692,20 @@ int32_t tsDecompressFloat(const char *const input, int32_t compressedSize, const } // Double ===================================================== -int32_t tsCompressDouble(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { +int32_t tsCompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { #ifdef TD_TSZ if (lossyDouble) { // lossy mode - return tsCompressDoubleLossyImp(input, nelements, output); + return tsCompressDoubleLossyImp(pIn, nEle, pOut); } else { #endif // lossless mode - if (algorithm == ONE_STAGE_COMP) { - return tsCompressDoubleImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressDoubleImp(input, nelements, buffer); - return tsCompressStringImp(buffer, len, output, outputSize); + if (cmprAlg == ONE_STAGE_COMP) { + return tsCompressDoubleImp(pIn, nEle, pOut); + } else if (cmprAlg == TWO_STAGE_COMP) { + int32_t len = tsCompressDoubleImp(pIn, nEle, pBuf); + return tsCompressStringImp(pBuf, len, pOut, nOut); } else { assert(0); return -1; @@ -1716,20 +1715,20 @@ int32_t tsCompressDouble(const char *const input, int32_t inputSize, const int32 #endif } -int32_t tsDecompressDouble(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { +int32_t tsDecompressDouble(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { #ifdef TD_TSZ if (HEAD_ALGO(input[0]) == ALGO_SZ_LOSSY) { // decompress lossy - return tsDecompressDoubleLossyImp(input, compressedSize, nelements, output); + return tsDecompressDoubleLossyImp(pIn, nIn, nEle, pOut); } else { #endif // decompress lossless - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressDoubleImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressDoubleImp(buffer, nelements, output); + if (cmprAlg == ONE_STAGE_COMP) { + return tsDecompressDoubleImp(pIn, nEle, pOut); + } else if (cmprAlg == TWO_STAGE_COMP) { + if (tsDecompressStringImp(pIn, nIn, pBuf, nBuf) < 0) return -1; + return tsDecompressDoubleImp(pBuf, nEle, pOut); } else { assert(0); return -1; @@ -1740,37 +1739,37 @@ int32_t tsDecompressDouble(const char *const input, int32_t compressedSize, cons } // Binary ===================================================== -int32_t tsCompressString(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - return tsCompressStringImp(input, inputSize, output, outputSize); +int32_t tsCompressString(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + return tsCompressStringImp(pIn, nIn, pOut, nOut); } -int32_t tsDecompressString(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - return tsDecompressStringImp(input, compressedSize, output, outputSize); +int32_t tsDecompressString(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + return tsDecompressStringImp(pIn, nIn, pOut, nOut); } // Bool ===================================================== -int32_t tsCompressBool(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressBoolImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressBoolImp(input, nelements, buffer); - return tsCompressStringImp(buffer, len, output, outputSize); +int32_t tsCompressBool(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsCompressBoolImp(pIn, nEle, pOut); + } else if (cmprAlg == TWO_STAGE_COMP) { + int32_t len = tsCompressBoolImp(pIn, nEle, pBuf); + return tsCompressStringImp(pBuf, len, pOut, nOut); } else { assert(0); return -1; } } -int32_t tsDecompressBool(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressBoolImp(input, nelements, output); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressBoolImp(buffer, nelements, output); +int32_t tsDecompressBool(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsDecompressBoolImp(pIn, nEle, pOut); + } else if (cmprAlg == TWO_STAGE_COMP) { + if (tsDecompressStringImp(pIn, nIn, pBuf, nBuf) < 0) return -1; + return tsDecompressBoolImp(pBuf, nEle, pOut); } else { assert(0); return -1; @@ -1778,27 +1777,26 @@ int32_t tsDecompressBool(const char *const input, int32_t compressedSize, const } // Tinyint ===================================================== -int32_t tsCompressTinyint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_TINYINT); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_TINYINT); - return tsCompressStringImp(buffer, len, output, outputSize); +int32_t tsCompressTinyint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsCompressINTImp(pIn, nEle, pOut, TSDB_DATA_TYPE_TINYINT); + } else if (cmprAlg == TWO_STAGE_COMP) { + int32_t len = tsCompressINTImp(pIn, nEle, pBuf, TSDB_DATA_TYPE_TINYINT); + return tsCompressStringImp(pBuf, len, pOut, nOut); } else { assert(0); return -1; } } -int32_t tsDecompressTinyint(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_TINYINT); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_TINYINT); +int32_t tsDecompressTinyint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsDecompressINTImp(pIn, nEle, pOut, TSDB_DATA_TYPE_TINYINT); + } else if (cmprAlg == TWO_STAGE_COMP) { + if (tsDecompressStringImp(pIn, nIn, pBuf, nBuf) < 0) return -1; + return tsDecompressINTImp(pBuf, nEle, pOut, TSDB_DATA_TYPE_TINYINT); } else { assert(0); return -1; @@ -1806,27 +1804,26 @@ int32_t tsDecompressTinyint(const char *const input, int32_t compressedSize, con } // Smallint ===================================================== -int32_t tsCompressSmallint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_SMALLINT); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_SMALLINT); - return tsCompressStringImp(buffer, len, output, outputSize); +int32_t tsCompressSmallint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsCompressINTImp(pIn, nEle, pOut, TSDB_DATA_TYPE_SMALLINT); + } else if (cmprAlg == TWO_STAGE_COMP) { + int32_t len = tsCompressINTImp(pIn, nEle, pBuf, TSDB_DATA_TYPE_SMALLINT); + return tsCompressStringImp(pBuf, len, pOut, nOut); } else { assert(0); return -1; } } -int32_t tsDecompressSmallint(const char *const input, int32_t compressedSize, const int32_t nelements, - char *const output, int32_t outputSize, char algorithm, char *const buffer, - int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_SMALLINT); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_SMALLINT); +int32_t tsDecompressSmallint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, + void *pBuf, int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsDecompressINTImp(pIn, nEle, pOut, TSDB_DATA_TYPE_SMALLINT); + } else if (cmprAlg == TWO_STAGE_COMP) { + if (tsDecompressStringImp(pIn, nIn, pBuf, nBuf) < 0) return -1; + return tsDecompressINTImp(pBuf, nEle, pOut, TSDB_DATA_TYPE_SMALLINT); } else { assert(0); return -1; @@ -1834,26 +1831,26 @@ int32_t tsDecompressSmallint(const char *const input, int32_t compressedSize, co } // Int ===================================================== -int32_t tsCompressInt(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_INT); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_INT); - return tsCompressStringImp(buffer, len, output, outputSize); +int32_t tsCompressInt(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsCompressINTImp(pIn, nEle, pOut, TSDB_DATA_TYPE_INT); + } else if (cmprAlg == TWO_STAGE_COMP) { + int32_t len = tsCompressINTImp(pIn, nEle, pBuf, TSDB_DATA_TYPE_INT); + return tsCompressStringImp(pBuf, len, pOut, nOut); } else { assert(0); return -1; } } -int32_t tsDecompressInt(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_INT); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_INT); +int32_t tsDecompressInt(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsDecompressINTImp(pIn, nEle, pOut, TSDB_DATA_TYPE_INT); + } else if (cmprAlg == TWO_STAGE_COMP) { + if (tsDecompressStringImp(pIn, nIn, pBuf, nBuf) < 0) return -1; + return tsDecompressINTImp(pBuf, nEle, pOut, TSDB_DATA_TYPE_INT); } else { assert(0); return -1; @@ -1861,26 +1858,26 @@ int32_t tsDecompressInt(const char *const input, int32_t compressedSize, const i } // Bigint ===================================================== -int32_t tsCompressBigint(const char *const input, int32_t inputSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsCompressINTImp(input, nelements, output, TSDB_DATA_TYPE_BIGINT); - } else if (algorithm == TWO_STAGE_COMP) { - int32_t len = tsCompressINTImp(input, nelements, buffer, TSDB_DATA_TYPE_BIGINT); - return tsCompressStringImp(buffer, len, output, outputSize); +int32_t tsCompressBigint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsCompressINTImp(pIn, nEle, pOut, TSDB_DATA_TYPE_BIGINT); + } else if (cmprAlg == TWO_STAGE_COMP) { + int32_t len = tsCompressINTImp(pIn, nEle, pBuf, TSDB_DATA_TYPE_BIGINT); + return tsCompressStringImp(pBuf, len, pOut, nOut); } else { assert(0); return -1; } } -int32_t tsDecompressBigint(const char *const input, int32_t compressedSize, const int32_t nelements, char *const output, - int32_t outputSize, char algorithm, char *const buffer, int32_t bufferSize) { - if (algorithm == ONE_STAGE_COMP) { - return tsDecompressINTImp(input, nelements, output, TSDB_DATA_TYPE_BIGINT); - } else if (algorithm == TWO_STAGE_COMP) { - if (tsDecompressStringImp(input, compressedSize, buffer, bufferSize) < 0) return -1; - return tsDecompressINTImp(buffer, nelements, output, TSDB_DATA_TYPE_BIGINT); +int32_t tsDecompressBigint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, + int32_t nBuf) { + if (cmprAlg == ONE_STAGE_COMP) { + return tsDecompressINTImp(pIn, nEle, pOut, TSDB_DATA_TYPE_BIGINT); + } else if (cmprAlg == TWO_STAGE_COMP) { + if (tsDecompressStringImp(pIn, nIn, pBuf, nBuf) < 0) return -1; + return tsDecompressINTImp(pBuf, nEle, pOut, TSDB_DATA_TYPE_BIGINT); } else { assert(0); return -1; From fb45b8d5773049d629506b0f0b9dce9c07b954a0 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 20 Sep 2022 13:39:32 +0800 Subject: [PATCH 003/143] refact code --- include/util/tcompression.h | 14 +++++ source/dnode/vnode/src/inc/tsdb.h | 4 +- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 63 ++-------------------- source/util/src/tcompression.c | 1 - 4 files changed, 20 insertions(+), 62 deletions(-) diff --git a/include/util/tcompression.h b/include/util/tcompression.h index b620615ab1..a884c4753f 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -83,6 +83,9 @@ static FORCE_INLINE int32_t tsDecompressDoubleLossy(const char *const input, int #endif +/************************************************************************* + * REGULAR COMPRESSION + *************************************************************************/ int32_t tsCompressTimestamp(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, int32_t nBuf); int32_t tsDecompressTimestamp(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, @@ -120,6 +123,17 @@ int32_t tsCompressBigint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32 int32_t tsDecompressBigint(void *pIn, int32_t nIn, int32_t nEle, void *pOut, int32_t nOut, uint8_t cmprAlg, void *pBuf, int32_t nBuf); +/************************************************************************* + * STREAM COMPRESSION + *************************************************************************/ +typedef struct SCompressor SCompressor; + +int32_t tCompressorCreate(SCompressor **ppCmprsor); +int32_t tCompressorDestroy(SCompressor *pCmprsor); +int32_t tCompressorReset(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg, int8_t autoAlloc); +int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int64_t *nData); +int32_t tCompress(SCompressor *pCmprsor, const void *pData, int64_t nData); + #ifdef __cplusplus } #endif diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 817089f237..c2a31679d0 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -285,8 +285,8 @@ int32_t tsdbDelFReaderClose(SDelFReader **ppReader); int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData); int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx); // tsdbRead.c ============================================================================================== -int32_t tsdbTakeReadSnap(STsdb *pTsdb, STsdbReadSnap **ppSnap, const char* id); -void tsdbUntakeReadSnap(STsdb *pTsdb, STsdbReadSnap *pSnap, const char* id); +int32_t tsdbTakeReadSnap(STsdb *pTsdb, STsdbReadSnap **ppSnap, const char *id); +void tsdbUntakeReadSnap(STsdb *pTsdb, STsdbReadSnap *pSnap, const char *id); // tsdbMerge.c ============================================================================================== int32_t tsdbMerge(STsdb *pTsdb); diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 3bd71f0ea6..0a42edc94c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -15,70 +15,15 @@ #include "tsdb.h" -typedef struct SDiskColBuilder SDiskColBuilder; -struct SDiskColBuilder { - uint8_t flags; - uint8_t *pBitMap; - int32_t *aOffset; - int32_t nData; - uint8_t *pData; -}; +typedef struct SDiskData SDiskData; -int32_t tDiskColAddVal(SDiskColBuilder *pBuilder, SColVal *pColVal) { - int32_t code = 0; - // TODO - return code; -} - -// ================================================================ -typedef struct SDiskDataBuilder SDiskDataBuilder; -struct SDiskDataBuilder { +struct SDiskData { SDiskDataHdr hdr; - SArray *aBlockCol; // SArray + /* data */ }; -int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder) { +int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow) { int32_t code = 0; // TODO return code; } - -void tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder) { - // TODO -} - -void tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, int64_t suid, int64_t uid, STSchema *pTSchema, int8_t cmprAlg) { - pBuilder->hdr = (SDiskDataHdr){.delimiter = TSDB_FILE_DLMT, // - .fmtVer = 0, - .suid = suid, - .uid = uid, - .cmprAlg = cmprAlg}; -} - -void tDiskDataBuilderReset(SDiskDataBuilder *pBuilder) { - // TODO -} - -int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, int64_t uid) { - int32_t code = 0; - - // uid (todo) - - // version (todo) - - // TSKEY (todo) - - SRowIter iter = {0}; - tRowIterInit(&iter, pRow, pTSchema); - - for (int32_t iDiskCol = 0; iDiskCol < 0; iDiskCol++) { - } - - return code; -} - -int32_t tDiskDataBuilderGet(SDiskDataBuilder *pBuilder, uint8_t **ppData) { - int32_t code = 0; - // TODO - return code; -} \ No newline at end of file diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 30b72f6fbe..3d4df28440 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1000,7 +1000,6 @@ int32_t tsDecompressDoubleLossyImp(const char *input, int32_t compressedSize, co * STREAM COMPRESSION *************************************************************************/ #define I64_SAFE_ADD(a, b) (((a) >= 0 && (b) <= INT64_MAX - (b)) || ((a) < 0 && (b) >= INT64_MIN - (a))) -typedef struct SCompressor SCompressor; static int32_t tCompBool(SCompressor *pCmprsor, const void *pData, int32_t nData); static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData); From 556a6fcd7fc27f9da69fb590add4b53b1ce55efb Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 20 Sep 2022 14:49:34 +0800 Subject: [PATCH 004/143] more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 207 ++++++++++++++++++++- 1 file changed, 203 insertions(+), 4 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 0a42edc94c..b7b03e8288 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -16,14 +16,213 @@ #include "tsdb.h" typedef struct SDiskData SDiskData; +typedef struct SDiskCol SDiskCol; -struct SDiskData { - SDiskDataHdr hdr; - /* data */ +struct SDiskCol { + int16_t cid; + int8_t type; + int8_t flag; + int32_t nVal; + SCompressor *pBitC; + SCompressor *pOffC; + SCompressor *pValC; }; -int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow) { +// SDiskCol ================================================ +static int32_t tDiskColReset(SDiskCol *pDiskCol, int16_t cid, int8_t type, uint8_t cmprAlg) { + int32_t code = 0; + + pDiskCol->cid = cid; + pDiskCol->type = type; + pDiskCol->flag = 0; + pDiskCol->nVal = 0; + + tCompressorReset(pDiskCol->pBitC, TSDB_DATA_TYPE_TINYINT, cmprAlg, 1); + tCompressorReset(pDiskCol->pOffC, TSDB_DATA_TYPE_INT, cmprAlg, 1); + tCompressorReset(pDiskCol->pValC, type, cmprAlg, 1); + + return code; +} + +static int32_t tDiskColAddVal0(SDiskCol *pDiskCol, SColVal *pColVal) { + int32_t code = 0; + + if (pColVal->isNone) { + pDiskCol->flag = HAS_NONE; + } else if (pColVal->isNull) { + pDiskCol->flag = HAS_NULL; + } else { + pDiskCol->flag = HAS_VALUE; + code = tCompress(pDiskCol->pValC, pColVal->value.pData, pColVal->value.nData /*TODO*/); + if (code) goto _exit; + } + pDiskCol->nVal++; + +_exit: + return code; +} +static int32_t tDiskColAddVal1(SDiskCol *pDiskCol, SColVal *pColVal) { + int32_t code = 0; + + if (!pColVal->isNone) { + } + pDiskCol->nVal++; + +_exit: + return code; +} +static int32_t tDiskColAddVal2(SDiskCol *pDiskCol, SColVal *pColVal) { + int32_t code = 0; + + if (!pColVal->isNull) { + } + pDiskCol->nVal++; + +_exit: + return code; +} +static int32_t tDiskColAddVal3(SDiskCol *pDiskCol, SColVal *pColVal) { + int32_t code = 0; + + if (pColVal->isNone) { + } else if (pColVal->isNull) { + } else { + } + pDiskCol->nVal++; + + return code; +} +static int32_t tDiskColAddVal4(SDiskCol *pDiskCol, SColVal *pColVal) { + int32_t code = 0; + + if (pColVal->isNone || pColVal->isNull) { + } else { + } + + pDiskCol->nVal++; + +_exit: + return code; +} +static int32_t tDiskColAddVal5(SDiskCol *pDiskCol, SColVal *pColVal) { + int32_t code = 0; + + if (pColVal->isNull) { + } else { + } + pDiskCol->nVal++; + + return code; +} +static int32_t tDiskColAddVal6(SDiskCol *pDiskCol, SColVal *pColVal) { + int32_t code = 0; + + if (pColVal->isNone) { + } else { + } + pDiskCol->nVal++; + + return code; +} +static int32_t tDiskColAddVal7(SDiskCol *pDiskCol, SColVal *pColVal) { + int32_t code = 0; + + if (pColVal->isNone) { + } else if (pColVal->isNull) { + } else { + } + pDiskCol->nVal++; + + return code; +} +static int32_t (*tDiskColAddValImpl[])(SDiskCol *pDiskCol, SColVal *pColVal) = { + tDiskColAddVal0, // 0 + tDiskColAddVal1, // HAS_NONE + tDiskColAddVal2, // HAS_NULL + tDiskColAddVal3, // HAS_NULL|HAS_NONE + tDiskColAddVal4, // HAS_VALUE + tDiskColAddVal5, // HAS_VALUE|HAS_NONE + tDiskColAddVal6, // HAS_VALUE|HAS_NULL + tDiskColAddVal7, // HAS_VALUE|HAS_NULL|HAS_NONE +}; + +// SDiskData ================================================ +struct SDiskData { + int64_t suid; + int64_t uid; + uint8_t cmprAlg; + SCompressor *pUidC; + SCompressor *pVerC; + SCompressor *pKeyC; + int32_t nDiskCol; + SArray *aDiskCol; +}; + +int32_t tDiskDataCreate(SDiskData *pDiskData) { int32_t code = 0; // TODO return code; } + +int32_t tDiskDataDestroy(SDiskData *pDiskData) { + int32_t code = 0; + // TODO + return code; +} + +int32_t tDiskDataReset(SDiskData *pDiskData, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg) { + int32_t code = 0; + + pDiskData->suid = pId->suid; + pDiskData->uid = pId->uid; + pDiskData->cmprAlg = cmprAlg; + + for (int32_t iCol = 1; iCol < pTSchema->numOfCols; iCol++) { + } + + return code; +} + +int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId) { + int32_t code = 0; + + ASSERT(pId->suid == pDiskData->suid); + + // uid + code = tCompress(pDiskData->pUidC, &pId->uid, sizeof(int64_t)); + if (code) goto _exit; + + // version + int64_t version = TSDBROW_VERSION(pRow); + code = tCompress(pDiskData->pVerC, &version, sizeof(int64_t)); + if (code) goto _exit; + + // TSKEY + TSKEY ts = TSDBROW_TS(pRow); + code = tCompress(pDiskData->pVerC, &ts, sizeof(int64_t)); + if (code) goto _exit; + + SRowIter iter = {0}; + tRowIterInit(&iter, pRow, pTSchema); + + SColVal *pColVal = tRowIterNext(&iter); + for (int32_t iDiskCol = 0; iDiskCol < pDiskData->nDiskCol; iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + + while (pColVal && pColVal->cid < pDiskCol->cid) { + pColVal = tRowIterNext(&iter); + } + + if (pColVal == NULL || pColVal->cid > pDiskCol->cid) { + code = tDiskColAddValImpl[pDiskCol->flag](pDiskCol, &COL_VAL_NONE(pDiskCol->cid, pDiskCol->type)); + if (code) goto _exit; + } else { + code = tDiskColAddValImpl[pDiskCol->flag](pDiskCol, pColVal); + if (code) goto _exit; + pColVal = tRowIterNext(&iter); + } + } + +_exit: + return code; +} From d197f5019c6bba6c52d8ada06452fac431842f6a Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 20 Sep 2022 16:18:12 +0800 Subject: [PATCH 005/143] more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 163 +++++++++++++++++++-- 1 file changed, 154 insertions(+), 9 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index b7b03e8288..c688a64580 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -23,7 +23,9 @@ struct SDiskCol { int8_t type; int8_t flag; int32_t nVal; + uint8_t bit; SCompressor *pBitC; + int32_t offset; SCompressor *pOffC; SCompressor *pValC; }; @@ -44,7 +46,21 @@ static int32_t tDiskColReset(SDiskCol *pDiskCol, int16_t cid, int8_t type, uint8 return code; } -static int32_t tDiskColAddVal0(SDiskCol *pDiskCol, SColVal *pColVal) { +static int32_t tDiskColAddValue(SDiskCol *pDiskCol, SColVal *pColVal) { + int32_t code = 0; + + if (IS_VAR_DATA_TYPE(pColVal->type)) { + code = tCompress(pDiskCol->pOffC, &pDiskCol->offset, sizeof(int32_t)); + if (code) goto _exit; + pDiskCol->offset += pColVal->value.nData; + } + code = tCompress(pDiskCol->pValC, pColVal->value.pData, pColVal->value.nData /*TODO*/); + if (code) goto _exit; + +_exit: + return code; +} +static int32_t tDiskColAddVal0(SDiskCol *pDiskCol, SColVal *pColVal) { // 0 int32_t code = 0; if (pColVal->isNone) { @@ -53,7 +69,7 @@ static int32_t tDiskColAddVal0(SDiskCol *pDiskCol, SColVal *pColVal) { pDiskCol->flag = HAS_NULL; } else { pDiskCol->flag = HAS_VALUE; - code = tCompress(pDiskCol->pValC, pColVal->value.pData, pColVal->value.nData /*TODO*/); + code = tDiskColAddValue(pDiskCol, pColVal); if (code) goto _exit; } pDiskCol->nVal++; @@ -61,42 +77,144 @@ static int32_t tDiskColAddVal0(SDiskCol *pDiskCol, SColVal *pColVal) { _exit: return code; } -static int32_t tDiskColAddVal1(SDiskCol *pDiskCol, SColVal *pColVal) { +static int32_t tDiskColAddVal1(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_NONE int32_t code = 0; if (!pColVal->isNone) { + // bit map + pDiskCol->bit = 0; + for (int32_t i = 0; i < (pDiskCol->nVal >> 3); i++) { + code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); + if (code) goto _exit; + } + SET_BIT1(&pDiskCol->bit, (pDiskCol->nVal & 0x3), 1); + if ((pDiskCol->nVal & 0x3) == 7) { + code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); + if (code) goto _exit; + pDiskCol->bit = 0; + } + + // value + if (pColVal->isNull) { + pDiskCol->flag |= HAS_NULL; + } else { + pDiskCol->flag |= HAS_VALUE; + + SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); + for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { + code = tDiskColAddValue(pDiskCol, &cv); + if (code) goto _exit; + } + + code = tDiskColAddValue(pDiskCol, pColVal); + if (code) goto _exit; + } } pDiskCol->nVal++; _exit: return code; } -static int32_t tDiskColAddVal2(SDiskCol *pDiskCol, SColVal *pColVal) { +static int32_t tDiskColAddVal2(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_NULL int32_t code = 0; if (!pColVal->isNull) { + if (pColVal->isNone) { + pDiskCol->flag |= HAS_NONE; + + pDiskCol->bit = 1; + for (int32_t i = 0; i < (pDiskCol->nVal >> 3); i++) { + code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); + if (code) goto _exit; + } + SET_BIT1(&pDiskCol->bit, (pDiskCol->nVal & 0x3), 0); + if ((pDiskCol->nVal & 0x3) == 7) { + code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); + if (code) goto _exit; + pDiskCol->bit = 0; + } + } else { + pDiskCol->flag |= HAS_VALUE; + + pDiskCol->bit = 0; + for (int32_t i = 0; i < (pDiskCol->nVal >> 3); i++) { + code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); + if (code) goto _exit; + } + SET_BIT1(&pDiskCol->bit, (pDiskCol->nVal & 0x3), 1); + if ((pDiskCol->nVal & 0x3) == 7) { + code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); + if (code) goto _exit; + pDiskCol->bit = 0; + } + + SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); + for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { + code = tDiskColAddValue(pDiskCol, &cv); + if (code) goto _exit; + } + + code = tDiskColAddValue(pDiskCol, pColVal); + if (code) goto _exit; + } } pDiskCol->nVal++; _exit: return code; } -static int32_t tDiskColAddVal3(SDiskCol *pDiskCol, SColVal *pColVal) { +static int32_t tDiskColAddVal3(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_NULL|HAS_NONE int32_t code = 0; + uint8_t mod8 = (pDiskCol->nVal & 0x3); if (pColVal->isNone) { + SET_BIT1(&pDiskCol->bit, mod8, 0); + if (mod8 == 7) { + code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); + if (code) goto _exit; + } } else if (pColVal->isNull) { + SET_BIT1(&pDiskCol->bit, mod8, 1); + if (mod8 == 7) { + code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); + if (code) goto _exit; + } } else { + pDiskCol->flag |= HAS_VALUE; + + // convert from bit1 to bit2 and add a 2 (todo) + + SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); + for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { + code = tDiskColAddValue(pDiskCol, &cv); + if (code) goto _exit; + } + + code = tDiskColAddValue(pDiskCol, pColVal); + if (code) goto _exit; } pDiskCol->nVal++; +_exit: return code; } -static int32_t tDiskColAddVal4(SDiskCol *pDiskCol, SColVal *pColVal) { +static int32_t tDiskColAddVal4(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_VALUE int32_t code = 0; if (pColVal->isNone || pColVal->isNull) { + if (pColVal->isNone) { + pDiskCol->flag |= HAS_NONE; + } else { + pDiskCol->flag |= HAS_NULL; + } + + // set bitmap (todo) + + code = tDiskColAddValue(pDiskCol, pColVal); + if (code) goto _exit; } else { + code = tDiskColAddValue(pDiskCol, pColVal); + if (code) goto _exit; } pDiskCol->nVal++; @@ -104,35 +222,62 @@ static int32_t tDiskColAddVal4(SDiskCol *pDiskCol, SColVal *pColVal) { _exit: return code; } -static int32_t tDiskColAddVal5(SDiskCol *pDiskCol, SColVal *pColVal) { +static int32_t tDiskColAddVal5(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_VALUE|HAS_NONE int32_t code = 0; if (pColVal->isNull) { + pDiskCol->flag |= HAS_NULL; + + // convert bit1 to bit2 } else { + if (pColVal->isNone) { + // SET_BIT1(0); + } else { + // SET_BIT1(1); + } } + code = tDiskColAddValue(pDiskCol, pColVal); + if (code) goto _exit; pDiskCol->nVal++; +_exit: return code; } -static int32_t tDiskColAddVal6(SDiskCol *pDiskCol, SColVal *pColVal) { +static int32_t tDiskColAddVal6(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_VALUE|HAS_NULL int32_t code = 0; if (pColVal->isNone) { + pDiskCol->flag |= HAS_NONE; + // bit1 to bit2 } else { + if (pColVal->isNull) { + // SET_BIT1(0) + } else { + // SET_BIT1(1) + } } + code = tDiskColAddValue(pDiskCol, pColVal); + if (code) goto _exit; pDiskCol->nVal++; +_exit: return code; } -static int32_t tDiskColAddVal7(SDiskCol *pDiskCol, SColVal *pColVal) { +static int32_t tDiskColAddVal7(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_VALUE|HAS_NULL|HAS_NONE int32_t code = 0; if (pColVal->isNone) { + // set_bit2(0); } else if (pColVal->isNull) { + // set_bit2(1); } else { + // set_bit2(2); } + code = tDiskColAddValue(pDiskCol, pColVal); + if (code) goto _exit; pDiskCol->nVal++; +_exit: return code; } static int32_t (*tDiskColAddValImpl[])(SDiskCol *pDiskCol, SColVal *pColVal) = { From 750a1a8d8679375e4fad3aca2091d61697da57d5 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 20 Sep 2022 18:56:36 +0800 Subject: [PATCH 006/143] more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 139 ++++++++++++--------- 1 file changed, 80 insertions(+), 59 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index c688a64580..1266efcf8e 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -23,8 +23,7 @@ struct SDiskCol { int8_t type; int8_t flag; int32_t nVal; - uint8_t bit; - SCompressor *pBitC; + uint8_t *pBitMap; int32_t offset; SCompressor *pOffC; SCompressor *pValC; @@ -39,7 +38,6 @@ static int32_t tDiskColReset(SDiskCol *pDiskCol, int16_t cid, int8_t type, uint8 pDiskCol->flag = 0; pDiskCol->nVal = 0; - tCompressorReset(pDiskCol->pBitC, TSDB_DATA_TYPE_TINYINT, cmprAlg, 1); tCompressorReset(pDiskCol->pOffC, TSDB_DATA_TYPE_INT, cmprAlg, 1); tCompressorReset(pDiskCol->pValC, type, cmprAlg, 1); @@ -82,17 +80,13 @@ static int32_t tDiskColAddVal1(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_N if (!pColVal->isNone) { // bit map - pDiskCol->bit = 0; - for (int32_t i = 0; i < (pDiskCol->nVal >> 3); i++) { - code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); - if (code) goto _exit; - } - SET_BIT1(&pDiskCol->bit, (pDiskCol->nVal & 0x3), 1); - if ((pDiskCol->nVal & 0x3) == 7) { - code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); - if (code) goto _exit; - pDiskCol->bit = 0; - } + int32_t nBit = BIT1_SIZE(pDiskCol->nVal + 1); + + code = tRealloc(&pDiskCol->pBitMap, nBit); + if (code) goto _exit; + + memset(pDiskCol->pBitMap, 0, nBit); + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); // value if (pColVal->isNull) { @@ -119,34 +113,20 @@ static int32_t tDiskColAddVal2(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_N int32_t code = 0; if (!pColVal->isNull) { + int32_t nBit = BIT1_SIZE(pDiskCol->nVal + 1); + code = tRealloc(&pDiskCol->pBitMap, nBit); + if (code) goto _exit; + if (pColVal->isNone) { pDiskCol->flag |= HAS_NONE; - pDiskCol->bit = 1; - for (int32_t i = 0; i < (pDiskCol->nVal >> 3); i++) { - code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); - if (code) goto _exit; - } - SET_BIT1(&pDiskCol->bit, (pDiskCol->nVal & 0x3), 0); - if ((pDiskCol->nVal & 0x3) == 7) { - code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); - if (code) goto _exit; - pDiskCol->bit = 0; - } + memset(pDiskCol->pBitMap, 255, nBit); + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); } else { pDiskCol->flag |= HAS_VALUE; - pDiskCol->bit = 0; - for (int32_t i = 0; i < (pDiskCol->nVal >> 3); i++) { - code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); - if (code) goto _exit; - } - SET_BIT1(&pDiskCol->bit, (pDiskCol->nVal & 0x3), 1); - if ((pDiskCol->nVal & 0x3) == 7) { - code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); - if (code) goto _exit; - pDiskCol->bit = 0; - } + memset(pDiskCol->pBitMap, 0, nBit); + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { @@ -166,23 +146,30 @@ _exit: static int32_t tDiskColAddVal3(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_NULL|HAS_NONE int32_t code = 0; - uint8_t mod8 = (pDiskCol->nVal & 0x3); if (pColVal->isNone) { - SET_BIT1(&pDiskCol->bit, mod8, 0); - if (mod8 == 7) { - code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); - if (code) goto _exit; - } + code = tRealloc(&pDiskCol->pBitMap, BIT1_SIZE(pDiskCol->nVal + 1)); + if (code) goto _exit; + + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); } else if (pColVal->isNull) { - SET_BIT1(&pDiskCol->bit, mod8, 1); - if (mod8 == 7) { - code = tCompress(pDiskCol->pBitC, &pDiskCol->bit, 1); - if (code) goto _exit; - } + code = tRealloc(&pDiskCol->pBitMap, BIT1_SIZE(pDiskCol->nVal + 1)); + if (code) goto _exit; + + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); } else { pDiskCol->flag |= HAS_VALUE; - // convert from bit1 to bit2 and add a 2 (todo) + uint8_t *pBitMap = NULL; + code = tRealloc(&pBitMap, BIT2_SIZE(pDiskCol->nVal + 1)); + if (code) goto _exit; + + for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pDiskCol->pBitMap, iVal)); + } + SET_BIT2(pBitMap, pDiskCol->nVal, 2); + + tFree(pDiskCol->pBitMap); + pDiskCol->pBitMap = pBitMap; SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { @@ -208,7 +195,12 @@ static int32_t tDiskColAddVal4(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_V pDiskCol->flag |= HAS_NULL; } - // set bitmap (todo) + int32_t nBit = BIT1_SIZE(pDiskCol->nVal + 1); + code = tRealloc(&pDiskCol->pBitMap, nBit); + if (code) goto _exit; + + memset(pDiskCol->pBitMap, 255, nBit); + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); code = tDiskColAddValue(pDiskCol, pColVal); if (code) goto _exit; @@ -216,7 +208,6 @@ static int32_t tDiskColAddVal4(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_V code = tDiskColAddValue(pDiskCol, pColVal); if (code) goto _exit; } - pDiskCol->nVal++; _exit: @@ -228,12 +219,25 @@ static int32_t tDiskColAddVal5(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_V if (pColVal->isNull) { pDiskCol->flag |= HAS_NULL; - // convert bit1 to bit2 + uint8_t *pBitMap = NULL; + code = tRealloc(&pBitMap, BIT2_SIZE(pDiskCol->nVal + 1)); + if (code) goto _exit; + + for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pDiskCol->pBitMap, iVal) ? 2 : 0); + } + SET_BIT2(pBitMap, pDiskCol->nVal, 1); + + tFree(pDiskCol->pBitMap); + pDiskCol->pBitMap = pBitMap; } else { + code = tRealloc(&pDiskCol->pBitMap, BIT1_SIZE(pDiskCol->nVal + 1)); + if (code) goto _exit; + if (pColVal->isNone) { - // SET_BIT1(0); + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); } else { - // SET_BIT1(1); + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); } } code = tDiskColAddValue(pDiskCol, pColVal); @@ -248,12 +252,26 @@ static int32_t tDiskColAddVal6(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_V if (pColVal->isNone) { pDiskCol->flag |= HAS_NONE; - // bit1 to bit2 + + uint8_t *pBitMap = NULL; + code = tRealloc(&pBitMap, BIT2_SIZE(pDiskCol->nVal + 1)); + if (code) goto _exit; + + for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pDiskCol->pBitMap, iVal) ? 2 : 1); + } + SET_BIT2(pBitMap, pDiskCol->nVal, 0); + + tFree(pDiskCol->pBitMap); + pDiskCol->pBitMap = pBitMap; } else { + code = tRealloc(&pDiskCol->pBitMap, BIT1_SIZE(pDiskCol->nVal + 1)); + if (code) goto _exit; + if (pColVal->isNull) { - // SET_BIT1(0) + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); } else { - // SET_BIT1(1) + SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); } } code = tDiskColAddValue(pDiskCol, pColVal); @@ -266,12 +284,15 @@ _exit: static int32_t tDiskColAddVal7(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_VALUE|HAS_NULL|HAS_NONE int32_t code = 0; + code = tRealloc(&pDiskCol->pBitMap, BIT2_SIZE(pDiskCol->nVal + 1)); + if (code) goto _exit; + if (pColVal->isNone) { - // set_bit2(0); + SET_BIT2(pDiskCol->pBitMap, pDiskCol->nVal, 0); } else if (pColVal->isNull) { - // set_bit2(1); + SET_BIT2(pDiskCol->pBitMap, pDiskCol->nVal, 1); } else { - // set_bit2(2); + SET_BIT2(pDiskCol->pBitMap, pDiskCol->nVal, 2); } code = tDiskColAddValue(pDiskCol, pColVal); if (code) goto _exit; From b4a43079fb04d2e9f71301a5ab7c1e184841345f Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 21 Sep 2022 11:03:08 +0800 Subject: [PATCH 007/143] more code --- include/util/tcompression.h | 2 +- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 110 ++++++++++++++++++--- source/util/src/tcompression.c | 16 ++- 3 files changed, 102 insertions(+), 26 deletions(-) diff --git a/include/util/tcompression.h b/include/util/tcompression.h index a884c4753f..fd01bcf1a3 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -130,7 +130,7 @@ typedef struct SCompressor SCompressor; int32_t tCompressorCreate(SCompressor **ppCmprsor); int32_t tCompressorDestroy(SCompressor *pCmprsor); -int32_t tCompressorReset(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg, int8_t autoAlloc); +int32_t tCompressorReset(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int64_t *nData); int32_t tCompress(SCompressor *pCmprsor, const void *pData, int64_t nData); diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 1266efcf8e..c20a598b6c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -22,6 +22,7 @@ struct SDiskCol { int16_t cid; int8_t type; int8_t flag; + uint8_t cmprAlg; int32_t nVal; uint8_t *pBitMap; int32_t offset; @@ -30,16 +31,41 @@ struct SDiskCol { }; // SDiskCol ================================================ -static int32_t tDiskColReset(SDiskCol *pDiskCol, int16_t cid, int8_t type, uint8_t cmprAlg) { +static int32_t tDiskColInit(SDiskCol *pDiskCol, int16_t cid, int8_t type, uint8_t cmprAlg) { int32_t code = 0; pDiskCol->cid = cid; pDiskCol->type = type; pDiskCol->flag = 0; + pDiskCol->cmprAlg = cmprAlg; pDiskCol->nVal = 0; + pDiskCol->offset = 0; - tCompressorReset(pDiskCol->pOffC, TSDB_DATA_TYPE_INT, cmprAlg, 1); - tCompressorReset(pDiskCol->pValC, type, cmprAlg, 1); + if (IS_VAR_DATA_TYPE(type)) { + if (pDiskCol->pOffC == NULL) { + code = tCompressorCreate(&pDiskCol->pOffC); + if (code) return code; + } + code = tCompressorReset(pDiskCol->pOffC, TSDB_DATA_TYPE_INT, cmprAlg); + if (code) return code; + } + + if (pDiskCol->pValC == NULL) { + code = tCompressorCreate(&pDiskCol->pValC); + if (code) return code; + } + code = tCompressorReset(pDiskCol->pValC, type, cmprAlg); + if (code) return code; + + return code; +} + +static int32_t tDiskColClear(SDiskCol *pDiskCol) { + int32_t code = 0; + + tFree(pDiskCol->pBitMap); + if (pDiskCol->pOffC) tCompressorDestroy(pDiskCol->pOffC); + if (pDiskCol->pValC) tCompressorDestroy(pDiskCol->pValC); return code; } @@ -324,26 +350,78 @@ struct SDiskData { SArray *aDiskCol; }; -int32_t tDiskDataCreate(SDiskData *pDiskData) { - int32_t code = 0; - // TODO - return code; -} - -int32_t tDiskDataDestroy(SDiskData *pDiskData) { - int32_t code = 0; - // TODO - return code; -} - -int32_t tDiskDataReset(SDiskData *pDiskData, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg) { +int32_t tDiskDataInit(SDiskData *pDiskData, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg) { int32_t code = 0; pDiskData->suid = pId->suid; pDiskData->uid = pId->uid; pDiskData->cmprAlg = cmprAlg; + if (pDiskData->pUidC == NULL) { + code = tCompressorCreate(&pDiskData->pUidC); + if (code) return code; + } + code = tCompressorReset(pDiskData->pUidC, TSDB_DATA_TYPE_BIGINT, cmprAlg); + if (code) return code; + + if (pDiskData->pVerC == NULL) { + code = tCompressorCreate(&pDiskData->pVerC); + if (code) return code; + } + code = tCompressorReset(pDiskData->pVerC, TSDB_DATA_TYPE_BIGINT, cmprAlg); + if (code) return code; + + if (pDiskData->pKeyC == NULL) { + code = tCompressorCreate(&pDiskData->pKeyC); + if (code) return code; + } + code = tCompressorReset(pDiskData->pKeyC, TSDB_DATA_TYPE_TIMESTAMP, cmprAlg); + if (code) return code; + + if (pDiskData->aDiskCol == NULL) { + pDiskData->aDiskCol = taosArrayInit(pTSchema->numOfCols - 1, sizeof(SDiskCol)); + if (pDiskData->aDiskCol == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + return code; + } + } + + pDiskData->nDiskCol = 0; for (int32_t iCol = 1; iCol < pTSchema->numOfCols; iCol++) { + STColumn *pTColumn = &pTSchema->columns[iCol]; + + if (pDiskData->nDiskCol >= taosArrayGetSize(pDiskData->aDiskCol)) { + SDiskCol dc = (SDiskCol){0}; + if (taosArrayPush(pDiskData->aDiskCol, &dc) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + return code; + } + } + + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, pDiskData->nDiskCol); + + code = tDiskColInit(pDiskCol, pTColumn->colId, pTColumn->type, cmprAlg); + if (code) return code; + + pDiskData->nDiskCol++; + } + + return code; +} + +int32_t tDiskDataDestroy(SDiskData *pDiskData) { + int32_t code = 0; + + if (pDiskData->pUidC) tCompressorDestroy(pDiskData->pUidC); + if (pDiskData->pVerC) tCompressorDestroy(pDiskData->pVerC); + if (pDiskData->pKeyC) tCompressorDestroy(pDiskData->pKeyC); + + if (pDiskData->aDiskCol) { + for (int32_t iDiskCol = 0; iDiskCol < taosArrayGetSize(pDiskData->aDiskCol); iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + tDiskColClear(pDiskCol); + } + taosArrayDestroy(pDiskData->aDiskCol); } return code; diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 3d4df28440..5d6e6d12ac 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1508,24 +1508,22 @@ _exit: int32_t tCompressorDestroy(SCompressor *pCmprsor) { int32_t code = 0; - if (pCmprsor) { - int32_t nBuf = sizeof(pCmprsor->aBuf) / sizeof(pCmprsor->aBuf[0]); - for (int32_t iBuf = 0; iBuf < nBuf; iBuf++) { - tFree(pCmprsor->aBuf[iBuf]); - } - - taosMemoryFree(pCmprsor); + int32_t nBuf = sizeof(pCmprsor->aBuf) / sizeof(pCmprsor->aBuf[0]); + for (int32_t iBuf = 0; iBuf < nBuf; iBuf++) { + tFree(pCmprsor->aBuf[iBuf]); } + taosMemoryFree(pCmprsor); + return code; } -int32_t tCompressorReset(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg, int8_t autoAlloc) { +int32_t tCompressorReset(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; pCmprsor->type = type; pCmprsor->cmprAlg = cmprAlg; - pCmprsor->autoAlloc = autoAlloc; + pCmprsor->autoAlloc = 1; pCmprsor->nVal = 0; switch (type) { From 8ffc7e9f3e42c3242f746d1d7a51e1f475718189 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 21 Sep 2022 11:28:20 +0800 Subject: [PATCH 008/143] more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 8 ++++++-- source/dnode/vnode/src/tsdb/tsdbUtil.c | 3 +-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index c20a598b6c..3904012988 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -342,6 +342,7 @@ static int32_t (*tDiskColAddValImpl[])(SDiskCol *pDiskCol, SColVal *pColVal) = { struct SDiskData { int64_t suid; int64_t uid; + int32_t nRow; uint8_t cmprAlg; SCompressor *pUidC; SCompressor *pVerC; @@ -355,6 +356,7 @@ int32_t tDiskDataInit(SDiskData *pDiskData, STSchema *pTSchema, TABLEID *pId, ui pDiskData->suid = pId->suid; pDiskData->uid = pId->uid; + pDiskData->nRow = 0; pDiskData->cmprAlg = cmprAlg; if (pDiskData->pUidC == NULL) { @@ -443,7 +445,7 @@ int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow, STSchema *pTSchema, // TSKEY TSKEY ts = TSDBROW_TS(pRow); - code = tCompress(pDiskData->pVerC, &ts, sizeof(int64_t)); + code = tCompress(pDiskData->pKeyC, &ts, sizeof(int64_t)); if (code) goto _exit; SRowIter iter = {0}; @@ -458,7 +460,8 @@ int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow, STSchema *pTSchema, } if (pColVal == NULL || pColVal->cid > pDiskCol->cid) { - code = tDiskColAddValImpl[pDiskCol->flag](pDiskCol, &COL_VAL_NONE(pDiskCol->cid, pDiskCol->type)); + SColVal cv = COL_VAL_NONE(pDiskCol->cid, pDiskCol->type); + code = tDiskColAddValImpl[pDiskCol->flag](pDiskCol, &cv); if (code) goto _exit; } else { code = tDiskColAddValImpl[pDiskCol->flag](pDiskCol, pColVal); @@ -466,6 +469,7 @@ int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow, STSchema *pTSchema, pColVal = tRowIterNext(&iter); } } + pDiskData->nRow++; _exit: return code; diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 64c150484b..4e6e1f2f7f 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -1082,9 +1082,8 @@ int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTS pColVal = tRowIterNext(&rIter); } } - -_exit: pBlockData->nRow++; + return code; _err: From ce9afbae19c86ae3707cd95226c4bd583802edff Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 21 Sep 2022 14:02:52 +0800 Subject: [PATCH 009/143] more code --- include/util/tcompression.h | 2 +- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 101 ++++++++++++++++++++- source/util/src/tcompression.c | 2 +- 3 files changed, 101 insertions(+), 4 deletions(-) diff --git a/include/util/tcompression.h b/include/util/tcompression.h index fd01bcf1a3..8d7c607e6b 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -131,7 +131,7 @@ typedef struct SCompressor SCompressor; int32_t tCompressorCreate(SCompressor **ppCmprsor); int32_t tCompressorDestroy(SCompressor *pCmprsor); int32_t tCompressorReset(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); -int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int64_t *nData); +int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); int32_t tCompress(SCompressor *pCmprsor, const void *pData, int64_t nData); #ifdef __cplusplus diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 3904012988..a5104dcfbd 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -349,6 +349,7 @@ struct SDiskData { SCompressor *pKeyC; int32_t nDiskCol; SArray *aDiskCol; + uint8_t *aBuf[2]; }; int32_t tDiskDataInit(SDiskData *pDiskData, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg) { @@ -425,6 +426,9 @@ int32_t tDiskDataDestroy(SDiskData *pDiskData) { } taosArrayDestroy(pDiskData->aDiskCol); } + for (int32_t iBuf = 0; iBuf < sizeof(pDiskData->aBuf) / sizeof(pDiskData->aBuf[0]); iBuf++) { + tFree(pDiskData->aBuf[iBuf]); + } return code; } @@ -435,8 +439,17 @@ int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow, STSchema *pTSchema, ASSERT(pId->suid == pDiskData->suid); // uid - code = tCompress(pDiskData->pUidC, &pId->uid, sizeof(int64_t)); - if (code) goto _exit; + if (pDiskData->uid && pDiskData->uid != pId->uid) { + for (int32_t iRow = 0; iRow < pDiskData->nRow; iRow++) { + code = tCompress(pDiskData->pUidC, &pDiskData->uid, sizeof(int64_t)); + if (code) goto _exit; + } + pDiskData->uid = 0; + } + if (pDiskData->uid == 0) { + code = tCompress(pDiskData->pUidC, &pId->uid, sizeof(int64_t)); + if (code) goto _exit; + } // version int64_t version = TSDBROW_VERSION(pRow); @@ -474,3 +487,87 @@ int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow, STSchema *pTSchema, _exit: return code; } + +int32_t tDiskDataToBinary(SDiskData *pDiskData, const uint8_t **ppData, int32_t *nData) { + int32_t code = 0; + + ASSERT(pDiskData->nRow); + + SDiskDataHdr hdr = {.delimiter = TSDB_FILE_DLMT, + .fmtVer = 0, + .suid = pDiskData->suid, + .uid = pDiskData->uid, + .szUid = 0, + .szVer = 0, + .szKey = 0, + .szBlkCol = 0, + .nRow = pDiskData->nRow, + .cmprAlg = pDiskData->cmprAlg}; + + // UID + const uint8_t *pUid = NULL; + if (pDiskData->uid == 0) { + code = tCompGen(pDiskData->pUidC, &pUid, &hdr.szUid); + if (code) return code; + } + + // VERSION + const uint8_t *pVer = NULL; + code = tCompGen(pDiskData->pVerC, &pVer, &hdr.szVer); + if (code) return code; + + // TSKEY + const uint8_t *pKey = NULL; + code = tCompGen(pDiskData->pKeyC, &pKey, &hdr.szKey); + if (code) return code; + + int32_t offset = 0; + for (int32_t iDiskCol = 0; iDiskCol < pDiskData->nDiskCol; iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + + if (pDiskCol->flag == HAS_NONE) continue; + + // code = tDiskColToBinary(pDiskCol, ); + // if (code) return code; + + SBlockCol bCol = {.cid = pDiskCol->cid, + .type = pDiskCol->type, + // .smaOn = , + .flag = pDiskCol->flag, + // .szOrigin = + // .szBitmap = + // .szOffset = + // .szValue = + .offset = offset}; + + hdr.szBlkCol += tPutBlockCol(NULL, &bCol); + offset = offset + bCol.szBitmap + bCol.szOffset + bCol.szValue; + } + + *nData = tPutDiskDataHdr(NULL, &hdr) + hdr.szUid + hdr.szVer + hdr.szKey + hdr.szBlkCol + offset; + code = tRealloc(&pDiskData->aBuf[0], *nData); + if (code) return code; + *ppData = pDiskData->aBuf[0]; + + int32_t n = 0; + n += tPutDiskDataHdr(pDiskData->aBuf[0] + n, &hdr); + if (hdr.szUid) { + memcpy(pDiskData->aBuf[0] + n, pUid, hdr.szUid); + n += hdr.szUid; + } + memcpy(pDiskData->aBuf[0] + n, pVer, hdr.szVer); + n += hdr.szVer; + memcpy(pDiskData->aBuf[0] + n, pKey, hdr.szKey); + n += hdr.szKey; + for (int32_t iDiskCol = 0; iDiskCol < pDiskData->nDiskCol; iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + n += tPutBlockCol(pDiskData->aBuf[0] + n, NULL /*pDiskCol->bCol (todo) */); + } + for (int32_t iDiskCol = 0; iDiskCol < pDiskData->nDiskCol; iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + // memcpy(pDiskData->aBuf[0] + n, NULL, ); + // n += 0; + } + + return code; +} diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 5d6e6d12ac..cd9ff5e325 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1574,7 +1574,7 @@ int32_t tCompressorReset(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { return code; } -int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int64_t *nData) { +int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; if (pCmprsor->nVal == 0) { From f51c86430a381a9bae6ec1c80726b3a0c09feb22 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 21 Sep 2022 14:50:14 +0800 Subject: [PATCH 010/143] more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 198 +++++++++++++-------- 1 file changed, 124 insertions(+), 74 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index a5104dcfbd..a0c1bb8934 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -15,8 +15,9 @@ #include "tsdb.h" -typedef struct SDiskData SDiskData; -typedef struct SDiskCol SDiskCol; +typedef struct SDiskDataBuilder SDiskDataBuilder; +typedef struct SDiskCol SDiskCol; +typedef struct SDiskData SDiskData; struct SDiskCol { int16_t cid; @@ -70,6 +71,34 @@ static int32_t tDiskColClear(SDiskCol *pDiskCol) { return code; } +static int32_t tDiskColToBinary(SDiskCol *pDiskCol, const uint8_t **ppData, int32_t *nData) { + int32_t code = 0; + + ASSERT(pDiskCol->flag && pDiskCol->flag != HAS_NONE); + + if (pDiskCol->flag == HAS_NULL) { + return code; + } + + // bitmap (todo) + if (pDiskCol->flag != HAS_VALUE) { + } + + // offset (todo) + if (IS_VAR_DATA_TYPE(pDiskCol->type)) { + code = tCompGen(pDiskCol->pOffC, NULL /* todo */, NULL /* todo */); + if (code) return code; + } + + // value (todo) + if (pDiskCol->flag != (HAS_NULL | HAS_NONE)) { + code = tCompGen(pDiskCol->pValC, NULL /* todo */, NULL /* todo */); + if (code) return code; + } + + return code; +} + static int32_t tDiskColAddValue(SDiskCol *pDiskCol, SColVal *pColVal) { int32_t code = 0; @@ -338,8 +367,8 @@ static int32_t (*tDiskColAddValImpl[])(SDiskCol *pDiskCol, SColVal *pColVal) = { tDiskColAddVal7, // HAS_VALUE|HAS_NULL|HAS_NONE }; -// SDiskData ================================================ -struct SDiskData { +// SDiskDataBuilder ================================================ +struct SDiskDataBuilder { int64_t suid; int64_t uid; int32_t nRow; @@ -352,121 +381,121 @@ struct SDiskData { uint8_t *aBuf[2]; }; -int32_t tDiskDataInit(SDiskData *pDiskData, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg) { +int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg) { int32_t code = 0; - pDiskData->suid = pId->suid; - pDiskData->uid = pId->uid; - pDiskData->nRow = 0; - pDiskData->cmprAlg = cmprAlg; + pBuilder->suid = pId->suid; + pBuilder->uid = pId->uid; + pBuilder->nRow = 0; + pBuilder->cmprAlg = cmprAlg; - if (pDiskData->pUidC == NULL) { - code = tCompressorCreate(&pDiskData->pUidC); + if (pBuilder->pUidC == NULL) { + code = tCompressorCreate(&pBuilder->pUidC); if (code) return code; } - code = tCompressorReset(pDiskData->pUidC, TSDB_DATA_TYPE_BIGINT, cmprAlg); + code = tCompressorReset(pBuilder->pUidC, TSDB_DATA_TYPE_BIGINT, cmprAlg); if (code) return code; - if (pDiskData->pVerC == NULL) { - code = tCompressorCreate(&pDiskData->pVerC); + if (pBuilder->pVerC == NULL) { + code = tCompressorCreate(&pBuilder->pVerC); if (code) return code; } - code = tCompressorReset(pDiskData->pVerC, TSDB_DATA_TYPE_BIGINT, cmprAlg); + code = tCompressorReset(pBuilder->pVerC, TSDB_DATA_TYPE_BIGINT, cmprAlg); if (code) return code; - if (pDiskData->pKeyC == NULL) { - code = tCompressorCreate(&pDiskData->pKeyC); + if (pBuilder->pKeyC == NULL) { + code = tCompressorCreate(&pBuilder->pKeyC); if (code) return code; } - code = tCompressorReset(pDiskData->pKeyC, TSDB_DATA_TYPE_TIMESTAMP, cmprAlg); + code = tCompressorReset(pBuilder->pKeyC, TSDB_DATA_TYPE_TIMESTAMP, cmprAlg); if (code) return code; - if (pDiskData->aDiskCol == NULL) { - pDiskData->aDiskCol = taosArrayInit(pTSchema->numOfCols - 1, sizeof(SDiskCol)); - if (pDiskData->aDiskCol == NULL) { + if (pBuilder->aDiskCol == NULL) { + pBuilder->aDiskCol = taosArrayInit(pTSchema->numOfCols - 1, sizeof(SDiskCol)); + if (pBuilder->aDiskCol == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; return code; } } - pDiskData->nDiskCol = 0; + pBuilder->nDiskCol = 0; for (int32_t iCol = 1; iCol < pTSchema->numOfCols; iCol++) { STColumn *pTColumn = &pTSchema->columns[iCol]; - if (pDiskData->nDiskCol >= taosArrayGetSize(pDiskData->aDiskCol)) { + if (pBuilder->nDiskCol >= taosArrayGetSize(pBuilder->aDiskCol)) { SDiskCol dc = (SDiskCol){0}; - if (taosArrayPush(pDiskData->aDiskCol, &dc) == NULL) { + if (taosArrayPush(pBuilder->aDiskCol, &dc) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; return code; } } - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, pDiskData->nDiskCol); + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, pBuilder->nDiskCol); code = tDiskColInit(pDiskCol, pTColumn->colId, pTColumn->type, cmprAlg); if (code) return code; - pDiskData->nDiskCol++; + pBuilder->nDiskCol++; } return code; } -int32_t tDiskDataDestroy(SDiskData *pDiskData) { +int32_t tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder) { int32_t code = 0; - if (pDiskData->pUidC) tCompressorDestroy(pDiskData->pUidC); - if (pDiskData->pVerC) tCompressorDestroy(pDiskData->pVerC); - if (pDiskData->pKeyC) tCompressorDestroy(pDiskData->pKeyC); + if (pBuilder->pUidC) tCompressorDestroy(pBuilder->pUidC); + if (pBuilder->pVerC) tCompressorDestroy(pBuilder->pVerC); + if (pBuilder->pKeyC) tCompressorDestroy(pBuilder->pKeyC); - if (pDiskData->aDiskCol) { - for (int32_t iDiskCol = 0; iDiskCol < taosArrayGetSize(pDiskData->aDiskCol); iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + if (pBuilder->aDiskCol) { + for (int32_t iDiskCol = 0; iDiskCol < taosArrayGetSize(pBuilder->aDiskCol); iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); tDiskColClear(pDiskCol); } - taosArrayDestroy(pDiskData->aDiskCol); + taosArrayDestroy(pBuilder->aDiskCol); } - for (int32_t iBuf = 0; iBuf < sizeof(pDiskData->aBuf) / sizeof(pDiskData->aBuf[0]); iBuf++) { - tFree(pDiskData->aBuf[iBuf]); + for (int32_t iBuf = 0; iBuf < sizeof(pBuilder->aBuf) / sizeof(pBuilder->aBuf[0]); iBuf++) { + tFree(pBuilder->aBuf[iBuf]); } return code; } -int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId) { +int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId) { int32_t code = 0; - ASSERT(pId->suid == pDiskData->suid); + ASSERT(pId->suid == pBuilder->suid); // uid - if (pDiskData->uid && pDiskData->uid != pId->uid) { - for (int32_t iRow = 0; iRow < pDiskData->nRow; iRow++) { - code = tCompress(pDiskData->pUidC, &pDiskData->uid, sizeof(int64_t)); + if (pBuilder->uid && pBuilder->uid != pId->uid) { + for (int32_t iRow = 0; iRow < pBuilder->nRow; iRow++) { + code = tCompress(pBuilder->pUidC, &pBuilder->uid, sizeof(int64_t)); if (code) goto _exit; } - pDiskData->uid = 0; + pBuilder->uid = 0; } - if (pDiskData->uid == 0) { - code = tCompress(pDiskData->pUidC, &pId->uid, sizeof(int64_t)); + if (pBuilder->uid == 0) { + code = tCompress(pBuilder->pUidC, &pId->uid, sizeof(int64_t)); if (code) goto _exit; } // version int64_t version = TSDBROW_VERSION(pRow); - code = tCompress(pDiskData->pVerC, &version, sizeof(int64_t)); + code = tCompress(pBuilder->pVerC, &version, sizeof(int64_t)); if (code) goto _exit; // TSKEY TSKEY ts = TSDBROW_TS(pRow); - code = tCompress(pDiskData->pKeyC, &ts, sizeof(int64_t)); + code = tCompress(pBuilder->pKeyC, &ts, sizeof(int64_t)); if (code) goto _exit; SRowIter iter = {0}; tRowIterInit(&iter, pRow, pTSchema); SColVal *pColVal = tRowIterNext(&iter); - for (int32_t iDiskCol = 0; iDiskCol < pDiskData->nDiskCol; iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + for (int32_t iDiskCol = 0; iDiskCol < pBuilder->nDiskCol; iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); while (pColVal && pColVal->cid < pDiskCol->cid) { pColVal = tRowIterNext(&iter); @@ -482,53 +511,53 @@ int32_t tDiskDataAddRow(SDiskData *pDiskData, TSDBROW *pRow, STSchema *pTSchema, pColVal = tRowIterNext(&iter); } } - pDiskData->nRow++; + pBuilder->nRow++; _exit: return code; } -int32_t tDiskDataToBinary(SDiskData *pDiskData, const uint8_t **ppData, int32_t *nData) { +int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { int32_t code = 0; - ASSERT(pDiskData->nRow); + ASSERT(pBuilder->nRow); SDiskDataHdr hdr = {.delimiter = TSDB_FILE_DLMT, .fmtVer = 0, - .suid = pDiskData->suid, - .uid = pDiskData->uid, + .suid = pBuilder->suid, + .uid = pBuilder->uid, .szUid = 0, .szVer = 0, .szKey = 0, .szBlkCol = 0, - .nRow = pDiskData->nRow, - .cmprAlg = pDiskData->cmprAlg}; + .nRow = pBuilder->nRow, + .cmprAlg = pBuilder->cmprAlg}; // UID const uint8_t *pUid = NULL; - if (pDiskData->uid == 0) { - code = tCompGen(pDiskData->pUidC, &pUid, &hdr.szUid); + if (pBuilder->uid == 0) { + code = tCompGen(pBuilder->pUidC, &pUid, &hdr.szUid); if (code) return code; } // VERSION const uint8_t *pVer = NULL; - code = tCompGen(pDiskData->pVerC, &pVer, &hdr.szVer); + code = tCompGen(pBuilder->pVerC, &pVer, &hdr.szVer); if (code) return code; // TSKEY const uint8_t *pKey = NULL; - code = tCompGen(pDiskData->pKeyC, &pKey, &hdr.szKey); + code = tCompGen(pBuilder->pKeyC, &pKey, &hdr.szKey); if (code) return code; int32_t offset = 0; - for (int32_t iDiskCol = 0; iDiskCol < pDiskData->nDiskCol; iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + for (int32_t iDiskCol = 0; iDiskCol < pBuilder->nDiskCol; iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); if (pDiskCol->flag == HAS_NONE) continue; - // code = tDiskColToBinary(pDiskCol, ); - // if (code) return code; + code = tDiskColToBinary(pDiskCol, NULL, NULL); + if (code) return code; SBlockCol bCol = {.cid = pDiskCol->cid, .type = pDiskCol->type, @@ -544,30 +573,51 @@ int32_t tDiskDataToBinary(SDiskData *pDiskData, const uint8_t **ppData, int32_t offset = offset + bCol.szBitmap + bCol.szOffset + bCol.szValue; } +#if 0 *nData = tPutDiskDataHdr(NULL, &hdr) + hdr.szUid + hdr.szVer + hdr.szKey + hdr.szBlkCol + offset; - code = tRealloc(&pDiskData->aBuf[0], *nData); + code = tRealloc(&pBuilder->aBuf[0], *nData); if (code) return code; - *ppData = pDiskData->aBuf[0]; + *ppData = pBuilder->aBuf[0]; int32_t n = 0; - n += tPutDiskDataHdr(pDiskData->aBuf[0] + n, &hdr); + n += tPutDiskDataHdr(pBuilder->aBuf[0] + n, &hdr); if (hdr.szUid) { - memcpy(pDiskData->aBuf[0] + n, pUid, hdr.szUid); + memcpy(pBuilder->aBuf[0] + n, pUid, hdr.szUid); n += hdr.szUid; } - memcpy(pDiskData->aBuf[0] + n, pVer, hdr.szVer); + memcpy(pBuilder->aBuf[0] + n, pVer, hdr.szVer); n += hdr.szVer; - memcpy(pDiskData->aBuf[0] + n, pKey, hdr.szKey); + memcpy(pBuilder->aBuf[0] + n, pKey, hdr.szKey); n += hdr.szKey; - for (int32_t iDiskCol = 0; iDiskCol < pDiskData->nDiskCol; iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); - n += tPutBlockCol(pDiskData->aBuf[0] + n, NULL /*pDiskCol->bCol (todo) */); + for (int32_t iDiskCol = 0; iDiskCol < pBuilder->nDiskCol; iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); + n += tPutBlockCol(pBuilder->aBuf[0] + n, NULL /*pDiskCol->bCol (todo) */); } - for (int32_t iDiskCol = 0; iDiskCol < pDiskData->nDiskCol; iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + for (int32_t iDiskCol = 0; iDiskCol < pBuilder->nDiskCol; iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); // memcpy(pDiskData->aBuf[0] + n, NULL, ); // n += 0; } +#endif + + return code; +} + +// SDiskData ================================================ +struct SDiskData { + SDiskDataHdr hdr; + const uint8_t *pUid; + const uint8_t *pVer; + const uint8_t *pKey; + SArray *aBlockCol; + SArray *aColData; +}; + +int32_t tDiskDataDestroy(SDiskData *pDiskData) { + int32_t code = 0; + + if (pDiskData->aBlockCol) taosArrayDestroy(pDiskData->aBlockCol); + if (pDiskData->aColData) taosArrayDestroy(pDiskData->aColData); return code; } From e12ac1dd6f9a0dd40bb7a8d1db3b649525803350 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 21 Sep 2022 15:00:32 +0800 Subject: [PATCH 011/143] more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 309 +++++++++++---------- 1 file changed, 155 insertions(+), 154 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index a0c1bb8934..a514bddabb 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -16,10 +16,10 @@ #include "tsdb.h" typedef struct SDiskDataBuilder SDiskDataBuilder; -typedef struct SDiskCol SDiskCol; +typedef struct SDiskColBuilder SDiskColBuilder; typedef struct SDiskData SDiskData; -struct SDiskCol { +struct SDiskColBuilder { int16_t cid; int8_t type; int8_t flag; @@ -31,332 +31,332 @@ struct SDiskCol { SCompressor *pValC; }; -// SDiskCol ================================================ -static int32_t tDiskColInit(SDiskCol *pDiskCol, int16_t cid, int8_t type, uint8_t cmprAlg) { +// SDiskColBuilder ================================================ +static int32_t tDiskColInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, uint8_t cmprAlg) { int32_t code = 0; - pDiskCol->cid = cid; - pDiskCol->type = type; - pDiskCol->flag = 0; - pDiskCol->cmprAlg = cmprAlg; - pDiskCol->nVal = 0; - pDiskCol->offset = 0; + pBuilder->cid = cid; + pBuilder->type = type; + pBuilder->flag = 0; + pBuilder->cmprAlg = cmprAlg; + pBuilder->nVal = 0; + pBuilder->offset = 0; if (IS_VAR_DATA_TYPE(type)) { - if (pDiskCol->pOffC == NULL) { - code = tCompressorCreate(&pDiskCol->pOffC); + if (pBuilder->pOffC == NULL) { + code = tCompressorCreate(&pBuilder->pOffC); if (code) return code; } - code = tCompressorReset(pDiskCol->pOffC, TSDB_DATA_TYPE_INT, cmprAlg); + code = tCompressorReset(pBuilder->pOffC, TSDB_DATA_TYPE_INT, cmprAlg); if (code) return code; } - if (pDiskCol->pValC == NULL) { - code = tCompressorCreate(&pDiskCol->pValC); + if (pBuilder->pValC == NULL) { + code = tCompressorCreate(&pBuilder->pValC); if (code) return code; } - code = tCompressorReset(pDiskCol->pValC, type, cmprAlg); + code = tCompressorReset(pBuilder->pValC, type, cmprAlg); if (code) return code; return code; } -static int32_t tDiskColClear(SDiskCol *pDiskCol) { +static int32_t tDiskColClear(SDiskColBuilder *pBuilder) { int32_t code = 0; - tFree(pDiskCol->pBitMap); - if (pDiskCol->pOffC) tCompressorDestroy(pDiskCol->pOffC); - if (pDiskCol->pValC) tCompressorDestroy(pDiskCol->pValC); + tFree(pBuilder->pBitMap); + if (pBuilder->pOffC) tCompressorDestroy(pBuilder->pOffC); + if (pBuilder->pValC) tCompressorDestroy(pBuilder->pValC); return code; } -static int32_t tDiskColToBinary(SDiskCol *pDiskCol, const uint8_t **ppData, int32_t *nData) { +static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SBlockCol *pBlockCol, const uint8_t **ppData) { int32_t code = 0; - ASSERT(pDiskCol->flag && pDiskCol->flag != HAS_NONE); + ASSERT(pBuilder->flag && pBuilder->flag != HAS_NONE); - if (pDiskCol->flag == HAS_NULL) { + if (pBuilder->flag == HAS_NULL) { return code; } // bitmap (todo) - if (pDiskCol->flag != HAS_VALUE) { + if (pBuilder->flag != HAS_VALUE) { } // offset (todo) - if (IS_VAR_DATA_TYPE(pDiskCol->type)) { - code = tCompGen(pDiskCol->pOffC, NULL /* todo */, NULL /* todo */); + if (IS_VAR_DATA_TYPE(pBuilder->type)) { + code = tCompGen(pBuilder->pOffC, NULL /* todo */, NULL /* todo */); if (code) return code; } // value (todo) - if (pDiskCol->flag != (HAS_NULL | HAS_NONE)) { - code = tCompGen(pDiskCol->pValC, NULL /* todo */, NULL /* todo */); + if (pBuilder->flag != (HAS_NULL | HAS_NONE)) { + code = tCompGen(pBuilder->pValC, NULL /* todo */, NULL /* todo */); if (code) return code; } return code; } -static int32_t tDiskColAddValue(SDiskCol *pDiskCol, SColVal *pColVal) { +static int32_t tDiskColAddValue(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; if (IS_VAR_DATA_TYPE(pColVal->type)) { - code = tCompress(pDiskCol->pOffC, &pDiskCol->offset, sizeof(int32_t)); + code = tCompress(pBuilder->pOffC, &pBuilder->offset, sizeof(int32_t)); if (code) goto _exit; - pDiskCol->offset += pColVal->value.nData; + pBuilder->offset += pColVal->value.nData; } - code = tCompress(pDiskCol->pValC, pColVal->value.pData, pColVal->value.nData /*TODO*/); + code = tCompress(pBuilder->pValC, pColVal->value.pData, pColVal->value.nData /*TODO*/); if (code) goto _exit; _exit: return code; } -static int32_t tDiskColAddVal0(SDiskCol *pDiskCol, SColVal *pColVal) { // 0 +static int32_t tDiskColAddVal0(SDiskColBuilder *pBuilder, SColVal *pColVal) { // 0 int32_t code = 0; if (pColVal->isNone) { - pDiskCol->flag = HAS_NONE; + pBuilder->flag = HAS_NONE; } else if (pColVal->isNull) { - pDiskCol->flag = HAS_NULL; + pBuilder->flag = HAS_NULL; } else { - pDiskCol->flag = HAS_VALUE; - code = tDiskColAddValue(pDiskCol, pColVal); + pBuilder->flag = HAS_VALUE; + code = tDiskColAddValue(pBuilder, pColVal); if (code) goto _exit; } - pDiskCol->nVal++; + pBuilder->nVal++; _exit: return code; } -static int32_t tDiskColAddVal1(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_NONE +static int32_t tDiskColAddVal1(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NONE int32_t code = 0; if (!pColVal->isNone) { // bit map - int32_t nBit = BIT1_SIZE(pDiskCol->nVal + 1); + int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); - code = tRealloc(&pDiskCol->pBitMap, nBit); + code = tRealloc(&pBuilder->pBitMap, nBit); if (code) goto _exit; - memset(pDiskCol->pBitMap, 0, nBit); - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); + memset(pBuilder->pBitMap, 0, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); // value if (pColVal->isNull) { - pDiskCol->flag |= HAS_NULL; + pBuilder->flag |= HAS_NULL; } else { - pDiskCol->flag |= HAS_VALUE; + pBuilder->flag |= HAS_VALUE; SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); - for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { - code = tDiskColAddValue(pDiskCol, &cv); + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + code = tDiskColAddValue(pBuilder, &cv); if (code) goto _exit; } - code = tDiskColAddValue(pDiskCol, pColVal); + code = tDiskColAddValue(pBuilder, pColVal); if (code) goto _exit; } } - pDiskCol->nVal++; + pBuilder->nVal++; _exit: return code; } -static int32_t tDiskColAddVal2(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_NULL +static int32_t tDiskColAddVal2(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NULL int32_t code = 0; if (!pColVal->isNull) { - int32_t nBit = BIT1_SIZE(pDiskCol->nVal + 1); - code = tRealloc(&pDiskCol->pBitMap, nBit); + int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); + code = tRealloc(&pBuilder->pBitMap, nBit); if (code) goto _exit; if (pColVal->isNone) { - pDiskCol->flag |= HAS_NONE; + pBuilder->flag |= HAS_NONE; - memset(pDiskCol->pBitMap, 255, nBit); - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); + memset(pBuilder->pBitMap, 255, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); } else { - pDiskCol->flag |= HAS_VALUE; + pBuilder->flag |= HAS_VALUE; - memset(pDiskCol->pBitMap, 0, nBit); - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); + memset(pBuilder->pBitMap, 0, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); - for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { - code = tDiskColAddValue(pDiskCol, &cv); + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + code = tDiskColAddValue(pBuilder, &cv); if (code) goto _exit; } - code = tDiskColAddValue(pDiskCol, pColVal); + code = tDiskColAddValue(pBuilder, pColVal); if (code) goto _exit; } } - pDiskCol->nVal++; + pBuilder->nVal++; _exit: return code; } -static int32_t tDiskColAddVal3(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_NULL|HAS_NONE +static int32_t tDiskColAddVal3(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NULL|HAS_NONE int32_t code = 0; if (pColVal->isNone) { - code = tRealloc(&pDiskCol->pBitMap, BIT1_SIZE(pDiskCol->nVal + 1)); + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); } else if (pColVal->isNull) { - code = tRealloc(&pDiskCol->pBitMap, BIT1_SIZE(pDiskCol->nVal + 1)); + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); } else { - pDiskCol->flag |= HAS_VALUE; + pBuilder->flag |= HAS_VALUE; uint8_t *pBitMap = NULL; - code = tRealloc(&pBitMap, BIT2_SIZE(pDiskCol->nVal + 1)); + code = tRealloc(&pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; - for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { - SET_BIT2(pBitMap, iVal, GET_BIT1(pDiskCol->pBitMap, iVal)); + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pBuilder->pBitMap, iVal)); } - SET_BIT2(pBitMap, pDiskCol->nVal, 2); + SET_BIT2(pBitMap, pBuilder->nVal, 2); - tFree(pDiskCol->pBitMap); - pDiskCol->pBitMap = pBitMap; + tFree(pBuilder->pBitMap); + pBuilder->pBitMap = pBitMap; SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); - for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { - code = tDiskColAddValue(pDiskCol, &cv); + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + code = tDiskColAddValue(pBuilder, &cv); if (code) goto _exit; } - code = tDiskColAddValue(pDiskCol, pColVal); + code = tDiskColAddValue(pBuilder, pColVal); if (code) goto _exit; } - pDiskCol->nVal++; + pBuilder->nVal++; _exit: return code; } -static int32_t tDiskColAddVal4(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_VALUE +static int32_t tDiskColAddVal4(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE int32_t code = 0; if (pColVal->isNone || pColVal->isNull) { if (pColVal->isNone) { - pDiskCol->flag |= HAS_NONE; + pBuilder->flag |= HAS_NONE; } else { - pDiskCol->flag |= HAS_NULL; + pBuilder->flag |= HAS_NULL; } - int32_t nBit = BIT1_SIZE(pDiskCol->nVal + 1); - code = tRealloc(&pDiskCol->pBitMap, nBit); + int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); + code = tRealloc(&pBuilder->pBitMap, nBit); if (code) goto _exit; - memset(pDiskCol->pBitMap, 255, nBit); - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); + memset(pBuilder->pBitMap, 255, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - code = tDiskColAddValue(pDiskCol, pColVal); + code = tDiskColAddValue(pBuilder, pColVal); if (code) goto _exit; } else { - code = tDiskColAddValue(pDiskCol, pColVal); + code = tDiskColAddValue(pBuilder, pColVal); if (code) goto _exit; } - pDiskCol->nVal++; + pBuilder->nVal++; _exit: return code; } -static int32_t tDiskColAddVal5(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_VALUE|HAS_NONE +static int32_t tDiskColAddVal5(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE|HAS_NONE int32_t code = 0; if (pColVal->isNull) { - pDiskCol->flag |= HAS_NULL; + pBuilder->flag |= HAS_NULL; uint8_t *pBitMap = NULL; - code = tRealloc(&pBitMap, BIT2_SIZE(pDiskCol->nVal + 1)); + code = tRealloc(&pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; - for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { - SET_BIT2(pBitMap, iVal, GET_BIT1(pDiskCol->pBitMap, iVal) ? 2 : 0); + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pBuilder->pBitMap, iVal) ? 2 : 0); } - SET_BIT2(pBitMap, pDiskCol->nVal, 1); + SET_BIT2(pBitMap, pBuilder->nVal, 1); - tFree(pDiskCol->pBitMap); - pDiskCol->pBitMap = pBitMap; + tFree(pBuilder->pBitMap); + pBuilder->pBitMap = pBitMap; } else { - code = tRealloc(&pDiskCol->pBitMap, BIT1_SIZE(pDiskCol->nVal + 1)); + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; if (pColVal->isNone) { - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); } else { - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); } } - code = tDiskColAddValue(pDiskCol, pColVal); + code = tDiskColAddValue(pBuilder, pColVal); if (code) goto _exit; - pDiskCol->nVal++; + pBuilder->nVal++; _exit: return code; } -static int32_t tDiskColAddVal6(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_VALUE|HAS_NULL +static int32_t tDiskColAddVal6(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE|HAS_NULL int32_t code = 0; if (pColVal->isNone) { - pDiskCol->flag |= HAS_NONE; + pBuilder->flag |= HAS_NONE; uint8_t *pBitMap = NULL; - code = tRealloc(&pBitMap, BIT2_SIZE(pDiskCol->nVal + 1)); + code = tRealloc(&pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; - for (int32_t iVal = 0; iVal < pDiskCol->nVal; iVal++) { - SET_BIT2(pBitMap, iVal, GET_BIT1(pDiskCol->pBitMap, iVal) ? 2 : 1); + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pBuilder->pBitMap, iVal) ? 2 : 1); } - SET_BIT2(pBitMap, pDiskCol->nVal, 0); + SET_BIT2(pBitMap, pBuilder->nVal, 0); - tFree(pDiskCol->pBitMap); - pDiskCol->pBitMap = pBitMap; + tFree(pBuilder->pBitMap); + pBuilder->pBitMap = pBitMap; } else { - code = tRealloc(&pDiskCol->pBitMap, BIT1_SIZE(pDiskCol->nVal + 1)); + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; if (pColVal->isNull) { - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 0); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); } else { - SET_BIT1(pDiskCol->pBitMap, pDiskCol->nVal, 1); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); } } - code = tDiskColAddValue(pDiskCol, pColVal); + code = tDiskColAddValue(pBuilder, pColVal); if (code) goto _exit; - pDiskCol->nVal++; + pBuilder->nVal++; _exit: return code; } -static int32_t tDiskColAddVal7(SDiskCol *pDiskCol, SColVal *pColVal) { // HAS_VALUE|HAS_NULL|HAS_NONE +static int32_t tDiskColAddVal7(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE|HAS_NULL|HAS_NONE int32_t code = 0; - code = tRealloc(&pDiskCol->pBitMap, BIT2_SIZE(pDiskCol->nVal + 1)); + code = tRealloc(&pBuilder->pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; if (pColVal->isNone) { - SET_BIT2(pDiskCol->pBitMap, pDiskCol->nVal, 0); + SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 0); } else if (pColVal->isNull) { - SET_BIT2(pDiskCol->pBitMap, pDiskCol->nVal, 1); + SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 1); } else { - SET_BIT2(pDiskCol->pBitMap, pDiskCol->nVal, 2); + SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 2); } - code = tDiskColAddValue(pDiskCol, pColVal); + code = tDiskColAddValue(pBuilder, pColVal); if (code) goto _exit; - pDiskCol->nVal++; + pBuilder->nVal++; _exit: return code; } -static int32_t (*tDiskColAddValImpl[])(SDiskCol *pDiskCol, SColVal *pColVal) = { +static int32_t (*tDiskColAddValImpl[])(SDiskColBuilder *pBuilder, SColVal *pColVal) = { tDiskColAddVal0, // 0 tDiskColAddVal1, // HAS_NONE tDiskColAddVal2, // HAS_NULL @@ -377,7 +377,7 @@ struct SDiskDataBuilder { SCompressor *pVerC; SCompressor *pKeyC; int32_t nDiskCol; - SArray *aDiskCol; + SArray *aDiskColBuilder; uint8_t *aBuf[2]; }; @@ -410,9 +410,9 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB code = tCompressorReset(pBuilder->pKeyC, TSDB_DATA_TYPE_TIMESTAMP, cmprAlg); if (code) return code; - if (pBuilder->aDiskCol == NULL) { - pBuilder->aDiskCol = taosArrayInit(pTSchema->numOfCols - 1, sizeof(SDiskCol)); - if (pBuilder->aDiskCol == NULL) { + if (pBuilder->aDiskColBuilder == NULL) { + pBuilder->aDiskColBuilder = taosArrayInit(pTSchema->numOfCols - 1, sizeof(SDiskColBuilder)); + if (pBuilder->aDiskColBuilder == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; return code; } @@ -422,17 +422,17 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB for (int32_t iCol = 1; iCol < pTSchema->numOfCols; iCol++) { STColumn *pTColumn = &pTSchema->columns[iCol]; - if (pBuilder->nDiskCol >= taosArrayGetSize(pBuilder->aDiskCol)) { - SDiskCol dc = (SDiskCol){0}; - if (taosArrayPush(pBuilder->aDiskCol, &dc) == NULL) { + if (pBuilder->nDiskCol >= taosArrayGetSize(pBuilder->aDiskColBuilder)) { + SDiskColBuilder dc = (SDiskColBuilder){0}; + if (taosArrayPush(pBuilder->aDiskColBuilder, &dc) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; return code; } } - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, pBuilder->nDiskCol); + SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aDiskColBuilder, pBuilder->nDiskCol); - code = tDiskColInit(pDiskCol, pTColumn->colId, pTColumn->type, cmprAlg); + code = tDiskColInit(pDiskColBuilder, pTColumn->colId, pTColumn->type, cmprAlg); if (code) return code; pBuilder->nDiskCol++; @@ -448,12 +448,13 @@ int32_t tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder) { if (pBuilder->pVerC) tCompressorDestroy(pBuilder->pVerC); if (pBuilder->pKeyC) tCompressorDestroy(pBuilder->pKeyC); - if (pBuilder->aDiskCol) { - for (int32_t iDiskCol = 0; iDiskCol < taosArrayGetSize(pBuilder->aDiskCol); iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); - tDiskColClear(pDiskCol); + if (pBuilder->aDiskColBuilder) { + for (int32_t iDiskColBuilder = 0; iDiskColBuilder < taosArrayGetSize(pBuilder->aDiskColBuilder); + iDiskColBuilder++) { + SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); + tDiskColClear(pDiskColBuilder); } - taosArrayDestroy(pBuilder->aDiskCol); + taosArrayDestroy(pBuilder->aDiskColBuilder); } for (int32_t iBuf = 0; iBuf < sizeof(pBuilder->aBuf) / sizeof(pBuilder->aBuf[0]); iBuf++) { tFree(pBuilder->aBuf[iBuf]); @@ -494,19 +495,19 @@ int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSche tRowIterInit(&iter, pRow, pTSchema); SColVal *pColVal = tRowIterNext(&iter); - for (int32_t iDiskCol = 0; iDiskCol < pBuilder->nDiskCol; iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); + for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nDiskCol; iDiskColBuilder++) { + SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); - while (pColVal && pColVal->cid < pDiskCol->cid) { + while (pColVal && pColVal->cid < pDiskColBuilder->cid) { pColVal = tRowIterNext(&iter); } - if (pColVal == NULL || pColVal->cid > pDiskCol->cid) { - SColVal cv = COL_VAL_NONE(pDiskCol->cid, pDiskCol->type); - code = tDiskColAddValImpl[pDiskCol->flag](pDiskCol, &cv); + if (pColVal == NULL || pColVal->cid > pDiskColBuilder->cid) { + SColVal cv = COL_VAL_NONE(pDiskColBuilder->cid, pDiskColBuilder->type); + code = tDiskColAddValImpl[pDiskColBuilder->flag](pDiskColBuilder, &cv); if (code) goto _exit; } else { - code = tDiskColAddValImpl[pDiskCol->flag](pDiskCol, pColVal); + code = tDiskColAddValImpl[pDiskColBuilder->flag](pDiskColBuilder, pColVal); if (code) goto _exit; pColVal = tRowIterNext(&iter); } @@ -551,18 +552,18 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { if (code) return code; int32_t offset = 0; - for (int32_t iDiskCol = 0; iDiskCol < pBuilder->nDiskCol; iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); + for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nDiskCol; iDiskColBuilder++) { + SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); - if (pDiskCol->flag == HAS_NONE) continue; + if (pDiskColBuilder->flag == HAS_NONE) continue; - code = tDiskColToBinary(pDiskCol, NULL, NULL); + code = tGnrtDiskCol(pDiskColBuilder, NULL, NULL); if (code) return code; - SBlockCol bCol = {.cid = pDiskCol->cid, - .type = pDiskCol->type, + SBlockCol bCol = {.cid = pDiskColBuilder->cid, + .type = pDiskColBuilder->type, // .smaOn = , - .flag = pDiskCol->flag, + .flag = pDiskColBuilder->flag, // .szOrigin = // .szBitmap = // .szOffset = @@ -589,12 +590,12 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { n += hdr.szVer; memcpy(pBuilder->aBuf[0] + n, pKey, hdr.szKey); n += hdr.szKey; - for (int32_t iDiskCol = 0; iDiskCol < pBuilder->nDiskCol; iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); + for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nDiskCol; iDiskColBuilder++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); n += tPutBlockCol(pBuilder->aBuf[0] + n, NULL /*pDiskCol->bCol (todo) */); } - for (int32_t iDiskCol = 0; iDiskCol < pBuilder->nDiskCol; iDiskCol++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskCol, iDiskCol); + for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nDiskCol; iDiskColBuilder++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); // memcpy(pDiskData->aBuf[0] + n, NULL, ); // n += 0; } From f8619dfbe8859dec9e5dae09abb60f5166ad92dc Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 21 Sep 2022 15:28:04 +0800 Subject: [PATCH 012/143] refact code for further refact --- include/common/tdataformat.h | 12 +-- source/common/src/tdataformat.c | 96 ++---------------- source/common/src/trow.c | 2 +- source/dnode/vnode/src/tsdb/tsdbCache.c | 6 +- source/dnode/vnode/src/tsdb/tsdbUtil.c | 127 +++++++++++++----------- 5 files changed, 80 insertions(+), 163 deletions(-) diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h index 5b49560175..8e0fc2f680 100644 --- a/include/common/tdataformat.h +++ b/include/common/tdataformat.h @@ -154,17 +154,7 @@ struct STSRowBuilder { struct SValue { union { - int8_t i8; // TSDB_DATA_TYPE_BOOL||TSDB_DATA_TYPE_TINYINT - uint8_t u8; // TSDB_DATA_TYPE_UTINYINT - int16_t i16; // TSDB_DATA_TYPE_SMALLINT - uint16_t u16; // TSDB_DATA_TYPE_USMALLINT - int32_t i32; // TSDB_DATA_TYPE_INT - uint32_t u32; // TSDB_DATA_TYPE_UINT - int64_t i64; // TSDB_DATA_TYPE_BIGINT - uint64_t u64; // TSDB_DATA_TYPE_UBIGINT - TSKEY ts; // TSDB_DATA_TYPE_TIMESTAMP - float f; // TSDB_DATA_TYPE_FLOAT - double d; // TSDB_DATA_TYPE_DOUBLE + int64_t val; struct { uint32_t nData; uint8_t *pData; diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index 15a369fe40..e37d587529 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -33,105 +33,21 @@ typedef struct { // SValue int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) { - int32_t n = 0; - if (IS_VAR_DATA_TYPE(type)) { - n += tPutBinary(p ? p + n : p, pValue->pData, pValue->nData); + return tPutBinary(p, pValue->pData, pValue->nData); } else { - switch (type) { - case TSDB_DATA_TYPE_BOOL: - n += tPutI8(p ? p + n : p, pValue->i8 ? 1 : 0); - break; - case TSDB_DATA_TYPE_TINYINT: - n += tPutI8(p ? p + n : p, pValue->i8); - break; - case TSDB_DATA_TYPE_SMALLINT: - n += tPutI16(p ? p + n : p, pValue->i16); - break; - case TSDB_DATA_TYPE_INT: - n += tPutI32(p ? p + n : p, pValue->i32); - break; - case TSDB_DATA_TYPE_BIGINT: - n += tPutI64(p ? p + n : p, pValue->i64); - break; - case TSDB_DATA_TYPE_FLOAT: - n += tPutFloat(p ? p + n : p, pValue->f); - break; - case TSDB_DATA_TYPE_DOUBLE: - n += tPutDouble(p ? p + n : p, pValue->d); - break; - case TSDB_DATA_TYPE_TIMESTAMP: - n += tPutI64(p ? p + n : p, pValue->ts); - break; - case TSDB_DATA_TYPE_UTINYINT: - n += tPutU8(p ? p + n : p, pValue->u8); - break; - case TSDB_DATA_TYPE_USMALLINT: - n += tPutU16(p ? p + n : p, pValue->u16); - break; - case TSDB_DATA_TYPE_UINT: - n += tPutU32(p ? p + n : p, pValue->u32); - break; - case TSDB_DATA_TYPE_UBIGINT: - n += tPutU64(p ? p + n : p, pValue->u64); - break; - default: - ASSERT(0); - } + if (p) memcpy(p, &pValue->val, tDataTypes[type].bytes); + return tDataTypes[type].bytes; } - - return n; } int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type) { - int32_t n = 0; - if (IS_VAR_DATA_TYPE(type)) { - n += tGetBinary(p, &pValue->pData, pValue ? &pValue->nData : NULL); + return tGetBinary(p, &pValue->pData, pValue ? &pValue->nData : NULL); } else { - switch (type) { - case TSDB_DATA_TYPE_BOOL: - n += tGetI8(p, &pValue->i8); - break; - case TSDB_DATA_TYPE_TINYINT: - n += tGetI8(p, &pValue->i8); - break; - case TSDB_DATA_TYPE_SMALLINT: - n += tGetI16(p, &pValue->i16); - break; - case TSDB_DATA_TYPE_INT: - n += tGetI32(p, &pValue->i32); - break; - case TSDB_DATA_TYPE_BIGINT: - n += tGetI64(p, &pValue->i64); - break; - case TSDB_DATA_TYPE_FLOAT: - n += tGetFloat(p, &pValue->f); - break; - case TSDB_DATA_TYPE_DOUBLE: - n += tGetDouble(p, &pValue->d); - break; - case TSDB_DATA_TYPE_TIMESTAMP: - n += tGetI64(p, &pValue->ts); - break; - case TSDB_DATA_TYPE_UTINYINT: - n += tGetU8(p, &pValue->u8); - break; - case TSDB_DATA_TYPE_USMALLINT: - n += tGetU16(p, &pValue->u16); - break; - case TSDB_DATA_TYPE_UINT: - n += tGetU32(p, &pValue->u32); - break; - case TSDB_DATA_TYPE_UBIGINT: - n += tGetU64(p, &pValue->u64); - break; - default: - ASSERT(0); - } + memcpy(&pValue->val, p, tDataTypes[type].bytes); + return tDataTypes[type].bytes; } - - return n; } int tValueCmprFn(const SValue *pValue1, const SValue *pValue2, int8_t type) { diff --git a/source/common/src/trow.c b/source/common/src/trow.c index 9880fe362e..f2e060ae86 100644 --- a/source/common/src/trow.c +++ b/source/common/src/trow.c @@ -689,7 +689,7 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow) { memcpy(varDataVal(varBuf), pColVal->value.pData, pColVal->value.nData); val = varBuf; } else { - val = (const void *)&pColVal->value.i64; + val = (const void *)&pColVal->value.val; } } else { pColVal = NULL; diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 8452d14c86..185d836e26 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -260,7 +260,7 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); if (keyTs > tTsVal->ts) { STColumn *pTColumn = &pTSchema->columns[0]; - SColVal tColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = keyTs}); + SColVal tColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = keyTs}); taosArraySet(pLast, iCol, &(SLastCol){.ts = keyTs, .colVal = tColVal}); } @@ -1048,7 +1048,7 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRo lastRowTs = TSDBROW_TS(pRow); STColumn *pTColumn = &pTSchema->columns[0]; - *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = lastRowTs}); + *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = lastRowTs}); if (taosArrayPush(pColArray, pColVal) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; @@ -1147,7 +1147,7 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) { lastRowTs = rowTs; STColumn *pTColumn = &pTSchema->columns[0]; - *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = lastRowTs}); + *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = lastRowTs}); if (taosArrayPush(pColArray, &(SLastCol){.ts = lastRowTs, .colVal = *pColVal}) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err; diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 4e6e1f2f7f..c77af951af 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -649,7 +649,7 @@ int32_t tRowMergerInit2(SRowMerger *pMerger, STSchema *pResTSchema, TSDBROW *pRo ASSERT(pTColumn->type == TSDB_DATA_TYPE_TIMESTAMP); - *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = key.ts}); + *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = key.ts}); if (taosArrayPush(pMerger->pArray, pColVal) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; @@ -690,7 +690,7 @@ int32_t tRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) { STColumn *pTColumn; int32_t iCol, jCol = 1; - ASSERT(((SColVal *)pMerger->pArray->pData)->value.ts == key.ts); + ASSERT(((SColVal *)pMerger->pArray->pData)->value.val == key.ts); for (iCol = 1; iCol < pMerger->pTSchema->numOfCols && jCol < pTSchema->numOfCols; ++iCol) { pTColumn = &pMerger->pTSchema->columns[iCol]; @@ -744,7 +744,7 @@ int32_t tRowMergerInit(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema) { ASSERT(pTColumn->type == TSDB_DATA_TYPE_TIMESTAMP); - *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = key.ts}); + *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = key.ts}); if (taosArrayPush(pMerger->pArray, pColVal) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; goto _exit; @@ -770,7 +770,7 @@ int32_t tRowMerge(SRowMerger *pMerger, TSDBROW *pRow) { TSDBKEY key = TSDBROW_KEY(pRow); SColVal *pColVal = &(SColVal){0}; - ASSERT(((SColVal *)pMerger->pArray->pData)->value.ts == key.ts); + ASSERT(((SColVal *)pMerger->pArray->pData)->value.val == key.ts); for (int32_t iCol = 1; iCol < pMerger->pTSchema->numOfCols; iCol++) { tsdbRowGetColVal(pRow, pMerger->pTSchema, iCol, pColVal); @@ -1513,73 +1513,79 @@ void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) { case TSDB_DATA_TYPE_BOOL: break; case TSDB_DATA_TYPE_TINYINT: { - pColAgg->sum += colVal.value.i8; - if (!minAssigned || pColAgg->min > colVal.value.i8) { - pColAgg->min = colVal.value.i8; + int8_t i8 = *(int8_t *)&colVal.value.val; + pColAgg->sum += i8; + if (!minAssigned || pColAgg->min > i8) { + pColAgg->min = i8; minAssigned = true; } - if (!maxAssigned || pColAgg->max < colVal.value.i8) { - pColAgg->max = colVal.value.i8; + if (!maxAssigned || pColAgg->max < i8) { + pColAgg->max = i8; maxAssigned = true; } break; } case TSDB_DATA_TYPE_SMALLINT: { - pColAgg->sum += colVal.value.i16; - if (!minAssigned || pColAgg->min > colVal.value.i16) { - pColAgg->min = colVal.value.i16; + int16_t i16 = *(int16_t *)&colVal.value.val; + pColAgg->sum += i16; + if (!minAssigned || pColAgg->min > i16) { + pColAgg->min = i16; minAssigned = true; } - if (!maxAssigned || pColAgg->max < colVal.value.i16) { - pColAgg->max = colVal.value.i16; + if (!maxAssigned || pColAgg->max < i16) { + pColAgg->max = i16; maxAssigned = true; } break; } case TSDB_DATA_TYPE_INT: { - pColAgg->sum += colVal.value.i32; - if (!minAssigned || pColAgg->min > colVal.value.i32) { - pColAgg->min = colVal.value.i32; + int32_t i32 = *(int32_t *)&colVal.value.val; + pColAgg->sum += i32; + if (!minAssigned || pColAgg->min > i32) { + pColAgg->min = i32; minAssigned = true; } - if (!maxAssigned || pColAgg->max < colVal.value.i32) { - pColAgg->max = colVal.value.i32; + if (!maxAssigned || pColAgg->max < i32) { + pColAgg->max = i32; maxAssigned = true; } break; } case TSDB_DATA_TYPE_BIGINT: { - pColAgg->sum += colVal.value.i64; - if (!minAssigned || pColAgg->min > colVal.value.i64) { - pColAgg->min = colVal.value.i64; + int64_t i64 = *(int64_t *)&colVal.value.val; + pColAgg->sum += i64; + if (!minAssigned || pColAgg->min > i64) { + pColAgg->min = i64; minAssigned = true; } - if (!maxAssigned || pColAgg->max < colVal.value.i64) { - pColAgg->max = colVal.value.i64; + if (!maxAssigned || pColAgg->max < i64) { + pColAgg->max = i64; maxAssigned = true; } break; } case TSDB_DATA_TYPE_FLOAT: { - *(double *)(&pColAgg->sum) += colVal.value.f; - if (!minAssigned || *(double *)(&pColAgg->min) > colVal.value.f) { - *(double *)(&pColAgg->min) = colVal.value.f; + float f = *(float *)&colVal.value.val; + *(double *)(&pColAgg->sum) += f; + if (!minAssigned || *(double *)(&pColAgg->min) > f) { + *(double *)(&pColAgg->min) = f; minAssigned = true; } - if (!maxAssigned || *(double *)(&pColAgg->max) < colVal.value.f) { - *(double *)(&pColAgg->max) = colVal.value.f; + if (!maxAssigned || *(double *)(&pColAgg->max) < f) { + *(double *)(&pColAgg->max) = f; maxAssigned = true; } break; } case TSDB_DATA_TYPE_DOUBLE: { - *(double *)(&pColAgg->sum) += colVal.value.d; - if (!minAssigned || *(double *)(&pColAgg->min) > colVal.value.d) { - *(double *)(&pColAgg->min) = colVal.value.d; + double d = *(double *)&colVal.value.val; + *(double *)(&pColAgg->sum) += d; + if (!minAssigned || *(double *)(&pColAgg->min) > d) { + *(double *)(&pColAgg->min) = d; minAssigned = true; } - if (!maxAssigned || *(double *)(&pColAgg->max) < colVal.value.d) { - *(double *)(&pColAgg->max) = colVal.value.d; + if (!maxAssigned || *(double *)(&pColAgg->max) < d) { + *(double *)(&pColAgg->max) = d; maxAssigned = true; } break; @@ -1587,12 +1593,13 @@ void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) { case TSDB_DATA_TYPE_VARCHAR: break; case TSDB_DATA_TYPE_TIMESTAMP: { - if (!minAssigned || pColAgg->min > colVal.value.i64) { - pColAgg->min = colVal.value.i64; + int64_t ts = *(int64_t *)&colVal.value.val; + if (!minAssigned || pColAgg->min > ts) { + pColAgg->min = ts; minAssigned = true; } - if (!maxAssigned || pColAgg->max < colVal.value.i64) { - pColAgg->max = colVal.value.i64; + if (!maxAssigned || pColAgg->max < ts) { + pColAgg->max = ts; maxAssigned = true; } break; @@ -1600,49 +1607,53 @@ void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) { case TSDB_DATA_TYPE_NCHAR: break; case TSDB_DATA_TYPE_UTINYINT: { - pColAgg->sum += colVal.value.u8; - if (!minAssigned || pColAgg->min > colVal.value.u8) { - pColAgg->min = colVal.value.u8; + uint8_t u8 = *(uint8_t *)&colVal.value.val; + pColAgg->sum += u8; + if (!minAssigned || pColAgg->min > u8) { + pColAgg->min = u8; minAssigned = true; } - if (!maxAssigned || pColAgg->max < colVal.value.u8) { - pColAgg->max = colVal.value.u8; + if (!maxAssigned || pColAgg->max < u8) { + pColAgg->max = u8; maxAssigned = true; } break; } case TSDB_DATA_TYPE_USMALLINT: { - pColAgg->sum += colVal.value.u16; - if (!minAssigned || pColAgg->min > colVal.value.u16) { - pColAgg->min = colVal.value.u16; + uint16_t u16 = *(uint16_t *)&colVal.value.val; + pColAgg->sum += u16; + if (!minAssigned || pColAgg->min > u16) { + pColAgg->min = u16; minAssigned = true; } - if (!maxAssigned || pColAgg->max < colVal.value.u16) { - pColAgg->max = colVal.value.u16; + if (!maxAssigned || pColAgg->max < u16) { + pColAgg->max = u16; maxAssigned = true; } break; } case TSDB_DATA_TYPE_UINT: { - pColAgg->sum += colVal.value.u32; - if (!minAssigned || pColAgg->min > colVal.value.u32) { - pColAgg->min = colVal.value.u32; + uint32_t u32 = *(uint32_t *)&colVal.value.val; + pColAgg->sum += u32; + if (!minAssigned || pColAgg->min > u32) { + pColAgg->min = u32; minAssigned = true; } - if (!minAssigned || pColAgg->max < colVal.value.u32) { - pColAgg->max = colVal.value.u32; + if (!minAssigned || pColAgg->max < u32) { + pColAgg->max = u32; maxAssigned = true; } break; } case TSDB_DATA_TYPE_UBIGINT: { - pColAgg->sum += colVal.value.u64; - if (!minAssigned || pColAgg->min > colVal.value.u64) { - pColAgg->min = colVal.value.u64; + uint64_t u64 = *(uint64_t *)&colVal.value.val; + pColAgg->sum += u64; + if (!minAssigned || pColAgg->min > u64) { + pColAgg->min = u64; minAssigned = true; } - if (!maxAssigned || pColAgg->max < colVal.value.u64) { - pColAgg->max = colVal.value.u64; + if (!maxAssigned || pColAgg->max < u64) { + pColAgg->max = u64; maxAssigned = true; } break; From f870f7e4538b29166d318de806df720477d23768 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 21 Sep 2022 16:08:51 +0800 Subject: [PATCH 013/143] fix gtest compile error --- source/common/test/dataformatTest.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/common/test/dataformatTest.cpp b/source/common/test/dataformatTest.cpp index 65f21bee40..5121724a08 100644 --- a/source/common/test/dataformatTest.cpp +++ b/source/common/test/dataformatTest.cpp @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#if 0 #include #include @@ -476,4 +477,5 @@ TEST(testCase, NoneTest) { taosArrayDestroy(pArray); taosMemoryFree(pTSchema); } +#endif #endif \ No newline at end of file From 0929326c1dbd9b0f458d75c9224d1803e8bcbbc6 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 21 Sep 2022 17:13:45 +0800 Subject: [PATCH 014/143] more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 213 ++++++++++----------- 1 file changed, 106 insertions(+), 107 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index a514bddabb..25c1ea20d6 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -17,6 +17,7 @@ typedef struct SDiskDataBuilder SDiskDataBuilder; typedef struct SDiskColBuilder SDiskColBuilder; +typedef struct SDiskCol SDiskCol; typedef struct SDiskData SDiskData; struct SDiskColBuilder { @@ -31,6 +32,34 @@ struct SDiskColBuilder { SCompressor *pValC; }; +struct SDiskDataBuilder { + int64_t suid; + int64_t uid; + int32_t nRow; + uint8_t cmprAlg; + SCompressor *pUidC; + SCompressor *pVerC; + SCompressor *pKeyC; + int32_t nBuilder; + SArray *aBuilder; + uint8_t *aBuf[2]; +}; + +struct SDiskCol { + SBlockCol bCol; + const uint8_t *pBit; + const uint8_t *pOff; + const uint8_t *pVal; +}; + +struct SDiskData { + SDiskDataHdr hdr; + const uint8_t *pUid; + const uint8_t *pVer; + const uint8_t *pKey; + SArray *aDiskCol; // SArray +}; + // SDiskColBuilder ================================================ static int32_t tDiskColInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, uint8_t cmprAlg) { int32_t code = 0; @@ -71,28 +100,40 @@ static int32_t tDiskColClear(SDiskColBuilder *pBuilder) { return code; } -static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SBlockCol *pBlockCol, const uint8_t **ppData) { +static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { int32_t code = 0; ASSERT(pBuilder->flag && pBuilder->flag != HAS_NONE); - if (pBuilder->flag == HAS_NULL) { - return code; - } + pDiskCol->bCol = (SBlockCol){.cid = pBuilder->cid, + .type = pBuilder->type, + .smaOn = 1, /* todo */ + .flag = pBuilder->flag, + .szOrigin = 0, // todo + .szBitmap = 0, // todo + .szOffset = 0, + .szValue = 0, // todo + .offset = 0}; + pDiskCol->pBit = NULL; + pDiskCol->pOff = NULL; + pDiskCol->pVal = NULL; - // bitmap (todo) + if (pBuilder->flag == HAS_NULL) return code; + + // BITMAP if (pBuilder->flag != HAS_VALUE) { + // TODO } - // offset (todo) + // OFFSET if (IS_VAR_DATA_TYPE(pBuilder->type)) { - code = tCompGen(pBuilder->pOffC, NULL /* todo */, NULL /* todo */); + code = tCompGen(pBuilder->pOffC, &pDiskCol->pOff, &pDiskCol->bCol.szOffset); if (code) return code; } - // value (todo) + // VALUE if (pBuilder->flag != (HAS_NULL | HAS_NONE)) { - code = tCompGen(pBuilder->pValC, NULL /* todo */, NULL /* todo */); + code = tCompGen(pBuilder->pValC, &pDiskCol->pVal, &pDiskCol->bCol.szValue); if (code) return code; } @@ -368,19 +409,6 @@ static int32_t (*tDiskColAddValImpl[])(SDiskColBuilder *pBuilder, SColVal *pColV }; // SDiskDataBuilder ================================================ -struct SDiskDataBuilder { - int64_t suid; - int64_t uid; - int32_t nRow; - uint8_t cmprAlg; - SCompressor *pUidC; - SCompressor *pVerC; - SCompressor *pKeyC; - int32_t nDiskCol; - SArray *aDiskColBuilder; - uint8_t *aBuf[2]; -}; - int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg) { int32_t code = 0; @@ -410,32 +438,32 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB code = tCompressorReset(pBuilder->pKeyC, TSDB_DATA_TYPE_TIMESTAMP, cmprAlg); if (code) return code; - if (pBuilder->aDiskColBuilder == NULL) { - pBuilder->aDiskColBuilder = taosArrayInit(pTSchema->numOfCols - 1, sizeof(SDiskColBuilder)); - if (pBuilder->aDiskColBuilder == NULL) { + if (pBuilder->aBuilder == NULL) { + pBuilder->aBuilder = taosArrayInit(pTSchema->numOfCols - 1, sizeof(SDiskColBuilder)); + if (pBuilder->aBuilder == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; return code; } } - pBuilder->nDiskCol = 0; + pBuilder->nBuilder = 0; for (int32_t iCol = 1; iCol < pTSchema->numOfCols; iCol++) { STColumn *pTColumn = &pTSchema->columns[iCol]; - if (pBuilder->nDiskCol >= taosArrayGetSize(pBuilder->aDiskColBuilder)) { + if (pBuilder->nBuilder >= taosArrayGetSize(pBuilder->aBuilder)) { SDiskColBuilder dc = (SDiskColBuilder){0}; - if (taosArrayPush(pBuilder->aDiskColBuilder, &dc) == NULL) { + if (taosArrayPush(pBuilder->aBuilder, &dc) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; return code; } } - SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aDiskColBuilder, pBuilder->nDiskCol); + SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, pBuilder->nBuilder); code = tDiskColInit(pDiskColBuilder, pTColumn->colId, pTColumn->type, cmprAlg); if (code) return code; - pBuilder->nDiskCol++; + pBuilder->nBuilder++; } return code; @@ -448,13 +476,12 @@ int32_t tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder) { if (pBuilder->pVerC) tCompressorDestroy(pBuilder->pVerC); if (pBuilder->pKeyC) tCompressorDestroy(pBuilder->pKeyC); - if (pBuilder->aDiskColBuilder) { - for (int32_t iDiskColBuilder = 0; iDiskColBuilder < taosArrayGetSize(pBuilder->aDiskColBuilder); - iDiskColBuilder++) { - SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); + if (pBuilder->aBuilder) { + for (int32_t iDiskColBuilder = 0; iDiskColBuilder < taosArrayGetSize(pBuilder->aBuilder); iDiskColBuilder++) { + SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iDiskColBuilder); tDiskColClear(pDiskColBuilder); } - taosArrayDestroy(pBuilder->aDiskColBuilder); + taosArrayDestroy(pBuilder->aBuilder); } for (int32_t iBuf = 0; iBuf < sizeof(pBuilder->aBuf) / sizeof(pBuilder->aBuf[0]); iBuf++) { tFree(pBuilder->aBuf[iBuf]); @@ -495,8 +522,8 @@ int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSche tRowIterInit(&iter, pRow, pTSchema); SColVal *pColVal = tRowIterNext(&iter); - for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nDiskCol; iDiskColBuilder++) { - SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); + for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nBuilder; iDiskColBuilder++) { + SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iDiskColBuilder); while (pColVal && pColVal->cid < pDiskColBuilder->cid) { pColVal = tRowIterNext(&iter); @@ -523,102 +550,74 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { ASSERT(pBuilder->nRow); - SDiskDataHdr hdr = {.delimiter = TSDB_FILE_DLMT, - .fmtVer = 0, - .suid = pBuilder->suid, - .uid = pBuilder->uid, - .szUid = 0, - .szVer = 0, - .szKey = 0, - .szBlkCol = 0, - .nRow = pBuilder->nRow, - .cmprAlg = pBuilder->cmprAlg}; + // reset SDiskData + pDiskData->hdr = (SDiskDataHdr){.delimiter = TSDB_FILE_DLMT, + .fmtVer = 0, + .suid = pBuilder->suid, + .uid = pBuilder->uid, + .szUid = 0, + .szVer = 0, + .szKey = 0, + .szBlkCol = 0, + .nRow = pBuilder->nRow, + .cmprAlg = pBuilder->cmprAlg}; + pDiskData->pUid = NULL; + pDiskData->pVer = NULL; + pDiskData->pKey = NULL; + if (pDiskData->aDiskCol) { + taosArrayClear(pDiskData->aDiskCol); + } else { + pDiskData->aDiskCol = taosArrayInit(pBuilder->nBuilder, sizeof(SDiskCol)); + if (pDiskData->aDiskCol == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + return code; + } + } // UID - const uint8_t *pUid = NULL; if (pBuilder->uid == 0) { - code = tCompGen(pBuilder->pUidC, &pUid, &hdr.szUid); + code = tCompGen(pBuilder->pUidC, &pDiskData->pUid, &pDiskData->hdr.szUid); if (code) return code; } // VERSION - const uint8_t *pVer = NULL; - code = tCompGen(pBuilder->pVerC, &pVer, &hdr.szVer); + code = tCompGen(pBuilder->pVerC, &pDiskData->pVer, &pDiskData->hdr.szVer); if (code) return code; // TSKEY - const uint8_t *pKey = NULL; - code = tCompGen(pBuilder->pKeyC, &pKey, &hdr.szKey); + code = tCompGen(pBuilder->pKeyC, &pDiskData->pKey, &pDiskData->hdr.szKey); if (code) return code; int32_t offset = 0; - for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nDiskCol; iDiskColBuilder++) { - SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); + for (int32_t iBuilder = 0; iBuilder < pBuilder->nBuilder; iBuilder++) { + SDiskColBuilder *pDCBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iBuilder); - if (pDiskColBuilder->flag == HAS_NONE) continue; + if (pDCBuilder->flag == HAS_NONE) continue; - code = tGnrtDiskCol(pDiskColBuilder, NULL, NULL); + SDiskCol dCol; + + code = tGnrtDiskCol(pDCBuilder, &dCol); if (code) return code; - SBlockCol bCol = {.cid = pDiskColBuilder->cid, - .type = pDiskColBuilder->type, - // .smaOn = , - .flag = pDiskColBuilder->flag, - // .szOrigin = - // .szBitmap = - // .szOffset = - // .szValue = - .offset = offset}; + dCol.bCol.offset = offset; + offset = offset + dCol.bCol.szBitmap + dCol.bCol.szOffset + dCol.bCol.szValue; - hdr.szBlkCol += tPutBlockCol(NULL, &bCol); - offset = offset + bCol.szBitmap + bCol.szOffset + bCol.szValue; - } + if (taosArrayPush(pDiskData->aDiskCol, &dCol) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + return code; + } -#if 0 - *nData = tPutDiskDataHdr(NULL, &hdr) + hdr.szUid + hdr.szVer + hdr.szKey + hdr.szBlkCol + offset; - code = tRealloc(&pBuilder->aBuf[0], *nData); - if (code) return code; - *ppData = pBuilder->aBuf[0]; - - int32_t n = 0; - n += tPutDiskDataHdr(pBuilder->aBuf[0] + n, &hdr); - if (hdr.szUid) { - memcpy(pBuilder->aBuf[0] + n, pUid, hdr.szUid); - n += hdr.szUid; + if (pDCBuilder->flag != HAS_NULL) { + pDiskData->hdr.szBlkCol += tPutBlockCol(NULL, &dCol.bCol); + } } - memcpy(pBuilder->aBuf[0] + n, pVer, hdr.szVer); - n += hdr.szVer; - memcpy(pBuilder->aBuf[0] + n, pKey, hdr.szKey); - n += hdr.szKey; - for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nDiskCol; iDiskColBuilder++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); - n += tPutBlockCol(pBuilder->aBuf[0] + n, NULL /*pDiskCol->bCol (todo) */); - } - for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nDiskCol; iDiskColBuilder++) { - SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pBuilder->aDiskColBuilder, iDiskColBuilder); - // memcpy(pDiskData->aBuf[0] + n, NULL, ); - // n += 0; - } -#endif return code; } // SDiskData ================================================ -struct SDiskData { - SDiskDataHdr hdr; - const uint8_t *pUid; - const uint8_t *pVer; - const uint8_t *pKey; - SArray *aBlockCol; - SArray *aColData; -}; - int32_t tDiskDataDestroy(SDiskData *pDiskData) { int32_t code = 0; - - if (pDiskData->aBlockCol) taosArrayDestroy(pDiskData->aBlockCol); - if (pDiskData->aColData) taosArrayDestroy(pDiskData->aColData); - + if (pDiskData->aDiskCol) taosArrayDestroy(pDiskData->aDiskCol); return code; } From a8b919918f79097b7aeb3a7a9990e7e3485a8385 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 21 Sep 2022 17:58:44 +0800 Subject: [PATCH 015/143] more code --- source/dnode/vnode/src/inc/tsdb.h | 23 +++++ source/dnode/vnode/src/tsdb/tsdbDiskData.c | 25 ++---- .../dnode/vnode/src/tsdb/tsdbReaderWriter.c | 87 +++++++++++++++++++ 3 files changed, 116 insertions(+), 19 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index c2a31679d0..e67fa2ee2d 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -32,6 +32,12 @@ extern "C" { #define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TSD ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0) // clang-format on +#define TSDB_CHECK_CODE(CODE, LINO, LABEL) \ + if (CODE) { \ + LINO = __LINE__; \ + goto LABEL; \ + } + typedef struct TSDBROW TSDBROW; typedef struct TABLEID TABLEID; typedef struct TSDBKEY TSDBKEY; @@ -65,6 +71,8 @@ typedef struct SSmaInfo SSmaInfo; typedef struct SBlockCol SBlockCol; typedef struct SVersionRange SVersionRange; typedef struct SLDataIter SLDataIter; +typedef struct SDiskCol SDiskCol; +typedef struct SDiskData SDiskData; #define TSDB_FILE_DLMT ((uint32_t)0xF00AFA0F) #define TSDB_MAX_SUBBLOCKS 8 @@ -652,6 +660,21 @@ typedef struct { STSchema *pTSchema; } SSkmInfo; +struct SDiskCol { + SBlockCol bCol; + const uint8_t *pBit; + const uint8_t *pOff; + const uint8_t *pVal; +}; + +struct SDiskData { + SDiskDataHdr hdr; + const uint8_t *pUid; + const uint8_t *pVer; + const uint8_t *pKey; + SArray *aDiskCol; // SArray +}; + int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid, STimeWindow *pTimeWindow, SVersionRange *pVerRange, void *pLoadInfo, const char *idStr); void tMergeTreeAddIter(SMergeTree *pMTree, SLDataIter *pIter); diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 25c1ea20d6..9b5934a04f 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -17,8 +17,6 @@ typedef struct SDiskDataBuilder SDiskDataBuilder; typedef struct SDiskColBuilder SDiskColBuilder; -typedef struct SDiskCol SDiskCol; -typedef struct SDiskData SDiskData; struct SDiskColBuilder { int16_t cid; @@ -45,21 +43,6 @@ struct SDiskDataBuilder { uint8_t *aBuf[2]; }; -struct SDiskCol { - SBlockCol bCol; - const uint8_t *pBit; - const uint8_t *pOff; - const uint8_t *pVal; -}; - -struct SDiskData { - SDiskDataHdr hdr; - const uint8_t *pUid; - const uint8_t *pVer; - const uint8_t *pKey; - SArray *aDiskCol; // SArray -}; - // SDiskColBuilder ================================================ static int32_t tDiskColInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, uint8_t cmprAlg) { int32_t code = 0; @@ -147,9 +130,13 @@ static int32_t tDiskColAddValue(SDiskColBuilder *pBuilder, SColVal *pColVal) { code = tCompress(pBuilder->pOffC, &pBuilder->offset, sizeof(int32_t)); if (code) goto _exit; pBuilder->offset += pColVal->value.nData; + + code = tCompress(pBuilder->pValC, pColVal->value.pData, pColVal->value.nData); + if (code) goto _exit; + } else { + code = tCompress(pBuilder->pValC, &pColVal->value.val, tDataTypes[pColVal->type].bytes); + if (code) goto _exit; } - code = tCompress(pBuilder->pValC, pColVal->value.pData, pColVal->value.nData /*TODO*/); - if (code) goto _exit; _exit: return code; diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index 5fe0b408b1..8674ae571e 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -607,6 +607,93 @@ _err: return code; } +int32_t tsdbWriteDiskData(SDataFWriter *pWriter, SDiskData *pDiskData, SBlockInfo *pBlkInfo) { + int32_t code = 0; + int32_t lino = 0; + + STsdbFD *pFD = pWriter->pDataFD; // todo + int64_t offset = pWriter->fData.size; + + // hdr + int32_t n = tPutDiskDataHdr(NULL, &pDiskData->hdr); + code = tRealloc(&pWriter->aBuf[0], n); + TSDB_CHECK_CODE(code, lino, _exit); + + tPutDiskDataHdr(pWriter->aBuf[0], &pDiskData->hdr); + + code = tsdbWriteFile(pFD, offset, pWriter->aBuf[0], n); + TSDB_CHECK_CODE(code, lino, _exit); + offset += n; + + // uid + ver + key + if (pDiskData->hdr.szUid) { + code = tsdbWriteFile(pFD, offset, pDiskData->pUid, pDiskData->hdr.szUid); + TSDB_CHECK_CODE(code, lino, _exit); + offset += pDiskData->hdr.szUid; + } + + code = tsdbWriteFile(pFD, offset, pDiskData->pVer, pDiskData->hdr.szVer); + TSDB_CHECK_CODE(code, lino, _exit); + offset += pDiskData->hdr.szVer; + + code = tsdbWriteFile(pFD, offset, pDiskData->pKey, pDiskData->hdr.szKey); + TSDB_CHECK_CODE(code, lino, _exit); + offset += pDiskData->hdr.szKey; + + // SBlockCol + if (pDiskData->hdr.szBlkCol) { + code = tRealloc(&pWriter->aBuf[0], pDiskData->hdr.szBlkCol); + TSDB_CHECK_CODE(code, lino, _exit); + + n = 0; + for (int32_t iDiskCol = 0; iDiskCol < taosArrayGetSize(pDiskData->aDiskCol); iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + + n += tPutBlockCol(pWriter->aBuf[0] + n, &pDiskCol->bCol); + } + + ASSERT(n == pDiskData->hdr.szBlkCol); + + code = tsdbWriteFile(pFD, offset, pWriter->aBuf[0], pDiskData->hdr.szBlkCol); + TSDB_CHECK_CODE(code, lino, _exit); + + offset += pDiskData->hdr.szBlkCol; + } + + // pData + for (int32_t iDiskCol = 0; iDiskCol < taosArrayGetSize(pDiskData->aDiskCol); iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + + if (pDiskCol->bCol.flag == HAS_NULL) continue; + + if (pDiskCol->bCol.szBitmap) { + code = tsdbWriteFile(pFD, offset, pDiskCol->pBit, pDiskCol->bCol.szBitmap); + TSDB_CHECK_CODE(code, lino, _exit); + offset += pDiskCol->bCol.szBitmap; + } + + if (pDiskCol->bCol.szOffset) { + code = tsdbWriteFile(pFD, offset, pDiskCol->pOff, pDiskCol->bCol.szOffset); + TSDB_CHECK_CODE(code, lino, _exit); + offset += pDiskCol->bCol.szOffset; + } + + if (pDiskCol->bCol.szValue) { + code = tsdbWriteFile(pFD, offset, pDiskCol->pVal, pDiskCol->bCol.szValue); + TSDB_CHECK_CODE(code, lino, _exit); + offset += pDiskCol->bCol.szValue; + } + } + +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } else { + tsdbDebug("vgId:%d %s", TD_VID(pWriter->pTsdb->pVnode), __func__); + } + return code; +} + int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo) { int32_t code = 0; int64_t n; From 9f7771cde4a892407a3d8802488addaea79a9f19 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 22 Sep 2022 11:52:47 +0800 Subject: [PATCH 016/143] refact more code --- include/util/tcompression.h | 2 +- source/dnode/vnode/src/inc/tsdb.h | 1 + source/dnode/vnode/src/tsdb/tsdbDiskData.c | 97 ++++++++++--------- .../dnode/vnode/src/tsdb/tsdbReaderWriter.c | 2 +- source/util/src/tcompression.c | 2 +- 5 files changed, 56 insertions(+), 48 deletions(-) diff --git a/include/util/tcompression.h b/include/util/tcompression.h index 8d7c607e6b..f22205d144 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -130,7 +130,7 @@ typedef struct SCompressor SCompressor; int32_t tCompressorCreate(SCompressor **ppCmprsor); int32_t tCompressorDestroy(SCompressor *pCmprsor); -int32_t tCompressorReset(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); +int32_t tCompressorInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); int32_t tCompress(SCompressor *pCmprsor, const void *pData, int64_t nData); diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index e67fa2ee2d..2121d779ab 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -665,6 +665,7 @@ struct SDiskCol { const uint8_t *pBit; const uint8_t *pOff; const uint8_t *pVal; + SColumnDataAgg agg; }; struct SDiskData { diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 9b5934a04f..9e2f8eec7c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -35,16 +35,17 @@ struct SDiskDataBuilder { int64_t uid; int32_t nRow; uint8_t cmprAlg; + uint8_t calcSma; SCompressor *pUidC; SCompressor *pVerC; SCompressor *pKeyC; int32_t nBuilder; - SArray *aBuilder; + SArray *aBuilder; // SArray uint8_t *aBuf[2]; }; // SDiskColBuilder ================================================ -static int32_t tDiskColInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, uint8_t cmprAlg) { +static int32_t tDiskColBuilderInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, uint8_t cmprAlg) { int32_t code = 0; pBuilder->cid = cid; @@ -59,7 +60,7 @@ static int32_t tDiskColInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, code = tCompressorCreate(&pBuilder->pOffC); if (code) return code; } - code = tCompressorReset(pBuilder->pOffC, TSDB_DATA_TYPE_INT, cmprAlg); + code = tCompressorInit(pBuilder->pOffC, TSDB_DATA_TYPE_INT, cmprAlg); if (code) return code; } @@ -67,13 +68,13 @@ static int32_t tDiskColInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, code = tCompressorCreate(&pBuilder->pValC); if (code) return code; } - code = tCompressorReset(pBuilder->pValC, type, cmprAlg); + code = tCompressorInit(pBuilder->pValC, type, cmprAlg); if (code) return code; return code; } -static int32_t tDiskColClear(SDiskColBuilder *pBuilder) { +static int32_t tDiskColBuilderClear(SDiskColBuilder *pBuilder) { int32_t code = 0; tFree(pBuilder->pBitMap); @@ -396,33 +397,60 @@ static int32_t (*tDiskColAddValImpl[])(SDiskColBuilder *pBuilder, SColVal *pColV }; // SDiskDataBuilder ================================================ -int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg) { +int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder) { + int32_t code = 0; + + *ppBuilder = (SDiskDataBuilder *)taosMemoryCalloc(1, sizeof(SDiskDataBuilder)); + if (*ppBuilder == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + return code; + } + + return code; +} + +void *tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder) { + if (pBuilder == NULL) return NULL; + + if (pBuilder->pUidC) tCompressorDestroy(pBuilder->pUidC); + if (pBuilder->pVerC) tCompressorDestroy(pBuilder->pVerC); + if (pBuilder->pKeyC) tCompressorDestroy(pBuilder->pKeyC); + + if (pBuilder->aBuilder) { + for (int32_t iBuilder = 0; iBuilder < taosArrayGetSize(pBuilder->aBuilder); iBuilder++) { + SDiskColBuilder *pDCBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iBuilder); + tDiskColBuilderClear(pDCBuilder); + } + taosArrayDestroy(pBuilder->aBuilder); + } + for (int32_t iBuf = 0; iBuf < sizeof(pBuilder->aBuf) / sizeof(pBuilder->aBuf[0]); iBuf++) { + tFree(pBuilder->aBuf[iBuf]); + } + taosMemoryFree(pBuilder); + + return NULL; +} + +int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg, + uint8_t calcSma) { int32_t code = 0; pBuilder->suid = pId->suid; pBuilder->uid = pId->uid; pBuilder->nRow = 0; pBuilder->cmprAlg = cmprAlg; + pBuilder->calcSma = calcSma; - if (pBuilder->pUidC == NULL) { - code = tCompressorCreate(&pBuilder->pUidC); - if (code) return code; - } - code = tCompressorReset(pBuilder->pUidC, TSDB_DATA_TYPE_BIGINT, cmprAlg); + if (pBuilder->pUidC == NULL && (code = tCompressorCreate(&pBuilder->pUidC))) return code; + code = tCompressorInit(pBuilder->pUidC, TSDB_DATA_TYPE_BIGINT, cmprAlg); if (code) return code; - if (pBuilder->pVerC == NULL) { - code = tCompressorCreate(&pBuilder->pVerC); - if (code) return code; - } - code = tCompressorReset(pBuilder->pVerC, TSDB_DATA_TYPE_BIGINT, cmprAlg); + if (pBuilder->pVerC == NULL && (code = tCompressorCreate(&pBuilder->pVerC))) return code; + code = tCompressorInit(pBuilder->pVerC, TSDB_DATA_TYPE_BIGINT, cmprAlg); if (code) return code; - if (pBuilder->pKeyC == NULL) { - code = tCompressorCreate(&pBuilder->pKeyC); - if (code) return code; - } - code = tCompressorReset(pBuilder->pKeyC, TSDB_DATA_TYPE_TIMESTAMP, cmprAlg); + if (pBuilder->pKeyC == NULL && (code = tCompressorCreate(&pBuilder->pKeyC))) return code; + code = tCompressorInit(pBuilder->pKeyC, TSDB_DATA_TYPE_TIMESTAMP, cmprAlg); if (code) return code; if (pBuilder->aBuilder == NULL) { @@ -438,7 +466,7 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB STColumn *pTColumn = &pTSchema->columns[iCol]; if (pBuilder->nBuilder >= taosArrayGetSize(pBuilder->aBuilder)) { - SDiskColBuilder dc = (SDiskColBuilder){0}; + SDiskColBuilder dc = {0}; if (taosArrayPush(pBuilder->aBuilder, &dc) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; return code; @@ -447,7 +475,7 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, pBuilder->nBuilder); - code = tDiskColInit(pDiskColBuilder, pTColumn->colId, pTColumn->type, cmprAlg); + code = tDiskColBuilderInit(pDiskColBuilder, pTColumn->colId, pTColumn->type, cmprAlg); if (code) return code; pBuilder->nBuilder++; @@ -456,27 +484,6 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB return code; } -int32_t tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder) { - int32_t code = 0; - - if (pBuilder->pUidC) tCompressorDestroy(pBuilder->pUidC); - if (pBuilder->pVerC) tCompressorDestroy(pBuilder->pVerC); - if (pBuilder->pKeyC) tCompressorDestroy(pBuilder->pKeyC); - - if (pBuilder->aBuilder) { - for (int32_t iDiskColBuilder = 0; iDiskColBuilder < taosArrayGetSize(pBuilder->aBuilder); iDiskColBuilder++) { - SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iDiskColBuilder); - tDiskColClear(pDiskColBuilder); - } - taosArrayDestroy(pBuilder->aBuilder); - } - for (int32_t iBuf = 0; iBuf < sizeof(pBuilder->aBuf) / sizeof(pBuilder->aBuf[0]); iBuf++) { - tFree(pBuilder->aBuf[iBuf]); - } - - return code; -} - int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId) { int32_t code = 0; @@ -605,6 +612,6 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { // SDiskData ================================================ int32_t tDiskDataDestroy(SDiskData *pDiskData) { int32_t code = 0; - if (pDiskData->aDiskCol) taosArrayDestroy(pDiskData->aDiskCol); + pDiskData->aDiskCol = taosArrayDestroy(pDiskData->aDiskCol); return code; } diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index 8674ae571e..679f7c3457 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -128,7 +128,7 @@ _exit: return code; } -static int32_t tsdbWriteFile(STsdbFD *pFD, int64_t offset, uint8_t *pBuf, int64_t size) { +static int32_t tsdbWriteFile(STsdbFD *pFD, int64_t offset, const uint8_t *pBuf, int64_t size) { int32_t code = 0; int64_t fOffset = LOGIC_TO_FILE_OFFSET(offset, pFD->szPage); int64_t pgno = OFFSET_PGNO(fOffset, pFD->szPage); diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index cd9ff5e325..619ae8360d 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1518,7 +1518,7 @@ int32_t tCompressorDestroy(SCompressor *pCmprsor) { return code; } -int32_t tCompressorReset(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { +int32_t tCompressorInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; pCmprsor->type = type; From a3cedbf1bc60a864e436ae294c345ba54f6b86f1 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 22 Sep 2022 13:49:34 +0800 Subject: [PATCH 017/143] more code --- source/dnode/vnode/src/inc/tsdb.h | 82 ++++++++++++---------- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 62 ++++++++-------- 2 files changed, 77 insertions(+), 67 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 2121d779ab..dc218e86e0 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -38,41 +38,42 @@ extern "C" { goto LABEL; \ } -typedef struct TSDBROW TSDBROW; -typedef struct TABLEID TABLEID; -typedef struct TSDBKEY TSDBKEY; -typedef struct SDelData SDelData; -typedef struct SDelIdx SDelIdx; -typedef struct STbData STbData; -typedef struct SMemTable SMemTable; -typedef struct STbDataIter STbDataIter; -typedef struct SMapData SMapData; -typedef struct SBlockIdx SBlockIdx; -typedef struct SDataBlk SDataBlk; -typedef struct SSttBlk SSttBlk; -typedef struct SDiskDataHdr SDiskDataHdr; -typedef struct SBlockData SBlockData; -typedef struct SDelFile SDelFile; -typedef struct SHeadFile SHeadFile; -typedef struct SDataFile SDataFile; -typedef struct SSttFile SSttFile; -typedef struct SSmaFile SSmaFile; -typedef struct SDFileSet SDFileSet; -typedef struct SDataFWriter SDataFWriter; -typedef struct SDataFReader SDataFReader; -typedef struct SDelFWriter SDelFWriter; -typedef struct SDelFReader SDelFReader; -typedef struct SRowIter SRowIter; -typedef struct STsdbFS STsdbFS; -typedef struct SRowMerger SRowMerger; -typedef struct STsdbReadSnap STsdbReadSnap; -typedef struct SBlockInfo SBlockInfo; -typedef struct SSmaInfo SSmaInfo; -typedef struct SBlockCol SBlockCol; -typedef struct SVersionRange SVersionRange; -typedef struct SLDataIter SLDataIter; -typedef struct SDiskCol SDiskCol; -typedef struct SDiskData SDiskData; +typedef struct TSDBROW TSDBROW; +typedef struct TABLEID TABLEID; +typedef struct TSDBKEY TSDBKEY; +typedef struct SDelData SDelData; +typedef struct SDelIdx SDelIdx; +typedef struct STbData STbData; +typedef struct SMemTable SMemTable; +typedef struct STbDataIter STbDataIter; +typedef struct SMapData SMapData; +typedef struct SBlockIdx SBlockIdx; +typedef struct SDataBlk SDataBlk; +typedef struct SSttBlk SSttBlk; +typedef struct SDiskDataHdr SDiskDataHdr; +typedef struct SBlockData SBlockData; +typedef struct SDelFile SDelFile; +typedef struct SHeadFile SHeadFile; +typedef struct SDataFile SDataFile; +typedef struct SSttFile SSttFile; +typedef struct SSmaFile SSmaFile; +typedef struct SDFileSet SDFileSet; +typedef struct SDataFWriter SDataFWriter; +typedef struct SDataFReader SDataFReader; +typedef struct SDelFWriter SDelFWriter; +typedef struct SDelFReader SDelFReader; +typedef struct SRowIter SRowIter; +typedef struct STsdbFS STsdbFS; +typedef struct SRowMerger SRowMerger; +typedef struct STsdbReadSnap STsdbReadSnap; +typedef struct SBlockInfo SBlockInfo; +typedef struct SSmaInfo SSmaInfo; +typedef struct SBlockCol SBlockCol; +typedef struct SVersionRange SVersionRange; +typedef struct SLDataIter SLDataIter; +typedef struct SDiskCol SDiskCol; +typedef struct SDiskData SDiskData; +typedef struct SDiskDataBuilder SDiskDataBuilder; #define TSDB_FILE_DLMT ((uint32_t)0xF00AFA0F) #define TSDB_MAX_SUBBLOCKS 8 @@ -302,7 +303,7 @@ int32_t tsdbMerge(STsdb *pTsdb); #define TSDB_CACHE_LAST_ROW(c) (((c).cacheLast & 1) > 0) #define TSDB_CACHE_LAST(c) (((c).cacheLast & 2) > 0) -// tsdbCache +// tsdbCache ============================================================================================== int32_t tsdbOpenCache(STsdb *pTsdb); void tsdbCloseCache(STsdb *pTsdb); int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb *pTsdb); @@ -320,6 +321,15 @@ size_t tsdbCacheGetCapacity(SVnode *pVnode); int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pSchema); +// tsdbDiskData ============================================================================================== +int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder); +void *tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder); +int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg, + uint8_t calcSma); +int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId); +int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData); +int32_t tDiskDataDestroy(SDiskData *pDiskData); + // structs ======================= struct STsdbFS { SDelFile *pDelFile; diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 9e2f8eec7c..b93b6a7007 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -15,8 +15,7 @@ #include "tsdb.h" -typedef struct SDiskDataBuilder SDiskDataBuilder; -typedef struct SDiskColBuilder SDiskColBuilder; +typedef struct SDiskColBuilder SDiskColBuilder; struct SDiskColBuilder { int16_t cid; @@ -45,6 +44,19 @@ struct SDiskDataBuilder { }; // SDiskColBuilder ================================================ +#define tDiskColBuilderCreate() \ + (SDiskColBuilder) { 0 } + +static int32_t tDiskColBuilderDestroy(SDiskColBuilder *pBuilder) { + int32_t code = 0; + + tFree(pBuilder->pBitMap); + if (pBuilder->pOffC) tCompressorDestroy(pBuilder->pOffC); + if (pBuilder->pValC) tCompressorDestroy(pBuilder->pValC); + + return code; +} + static int32_t tDiskColBuilderInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, uint8_t cmprAlg) { int32_t code = 0; @@ -74,16 +86,6 @@ static int32_t tDiskColBuilderInit(SDiskColBuilder *pBuilder, int16_t cid, int8_ return code; } -static int32_t tDiskColBuilderClear(SDiskColBuilder *pBuilder) { - int32_t code = 0; - - tFree(pBuilder->pBitMap); - if (pBuilder->pOffC) tCompressorDestroy(pBuilder->pOffC); - if (pBuilder->pValC) tCompressorDestroy(pBuilder->pValC); - - return code; -} - static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { int32_t code = 0; @@ -419,7 +421,7 @@ void *tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder) { if (pBuilder->aBuilder) { for (int32_t iBuilder = 0; iBuilder < taosArrayGetSize(pBuilder->aBuilder); iBuilder++) { SDiskColBuilder *pDCBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iBuilder); - tDiskColBuilderClear(pDCBuilder); + tDiskColBuilderDestroy(pDCBuilder); } taosArrayDestroy(pBuilder->aBuilder); } @@ -466,7 +468,7 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB STColumn *pTColumn = &pTSchema->columns[iCol]; if (pBuilder->nBuilder >= taosArrayGetSize(pBuilder->aBuilder)) { - SDiskColBuilder dc = {0}; + SDiskColBuilder dc = tDiskColBuilderCreate(); if (taosArrayPush(pBuilder->aBuilder, &dc) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; return code; @@ -491,51 +493,51 @@ int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSche // uid if (pBuilder->uid && pBuilder->uid != pId->uid) { + ASSERT(!pBuilder->calcSma); for (int32_t iRow = 0; iRow < pBuilder->nRow; iRow++) { code = tCompress(pBuilder->pUidC, &pBuilder->uid, sizeof(int64_t)); - if (code) goto _exit; + if (code) return code; } pBuilder->uid = 0; } if (pBuilder->uid == 0) { code = tCompress(pBuilder->pUidC, &pId->uid, sizeof(int64_t)); - if (code) goto _exit; + if (code) return code; } // version int64_t version = TSDBROW_VERSION(pRow); code = tCompress(pBuilder->pVerC, &version, sizeof(int64_t)); - if (code) goto _exit; + if (code) return code; // TSKEY TSKEY ts = TSDBROW_TS(pRow); code = tCompress(pBuilder->pKeyC, &ts, sizeof(int64_t)); - if (code) goto _exit; + if (code) return code; SRowIter iter = {0}; tRowIterInit(&iter, pRow, pTSchema); SColVal *pColVal = tRowIterNext(&iter); - for (int32_t iDiskColBuilder = 0; iDiskColBuilder < pBuilder->nBuilder; iDiskColBuilder++) { - SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iDiskColBuilder); + for (int32_t iBuilder = 0; iBuilder < pBuilder->nBuilder; iBuilder++) { + SDiskColBuilder *pDCBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iBuilder); - while (pColVal && pColVal->cid < pDiskColBuilder->cid) { + while (pColVal && pColVal->cid < pDCBuilder->cid) { pColVal = tRowIterNext(&iter); } - if (pColVal == NULL || pColVal->cid > pDiskColBuilder->cid) { - SColVal cv = COL_VAL_NONE(pDiskColBuilder->cid, pDiskColBuilder->type); - code = tDiskColAddValImpl[pDiskColBuilder->flag](pDiskColBuilder, &cv); - if (code) goto _exit; + if (pColVal == NULL || pColVal->cid > pDCBuilder->cid) { + SColVal cv = COL_VAL_NONE(pDCBuilder->cid, pDCBuilder->type); + code = tDiskColAddValImpl[pDCBuilder->flag](pDCBuilder, &cv); + if (code) return code; } else { - code = tDiskColAddValImpl[pDiskColBuilder->flag](pDiskColBuilder, pColVal); - if (code) goto _exit; + code = tDiskColAddValImpl[pDCBuilder->flag](pDCBuilder, pColVal); + if (code) return code; pColVal = tRowIterNext(&iter); } } pBuilder->nRow++; -_exit: return code; } @@ -601,9 +603,7 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { return code; } - if (pDCBuilder->flag != HAS_NULL) { - pDiskData->hdr.szBlkCol += tPutBlockCol(NULL, &dCol.bCol); - } + pDiskData->hdr.szBlkCol += tPutBlockCol(NULL, &dCol.bCol); } return code; From 1bab3c1b4d73c173521a458e7aa7ff3ce5351e0b Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 22 Sep 2022 18:24:24 +0800 Subject: [PATCH 018/143] optimize more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 244 +++++++++++++++------ 1 file changed, 178 insertions(+), 66 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index b93b6a7007..5a235c5c82 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -18,15 +18,20 @@ typedef struct SDiskColBuilder SDiskColBuilder; struct SDiskColBuilder { - int16_t cid; - int8_t type; - int8_t flag; - uint8_t cmprAlg; - int32_t nVal; - uint8_t *pBitMap; - int32_t offset; - SCompressor *pOffC; - SCompressor *pValC; + int16_t cid; + int8_t type; + uint8_t cmprAlg; + uint8_t calcSma; + int8_t flag; + int32_t nVal; + uint8_t *pBitMap; + int32_t offset; + SCompressor *pOffC; + SCompressor *pValC; + SColumnDataAgg sma; + uint8_t minSet; + uint8_t maxSet; + uint8_t *aBuf[1]; }; struct SDiskDataBuilder { @@ -53,36 +58,41 @@ static int32_t tDiskColBuilderDestroy(SDiskColBuilder *pBuilder) { tFree(pBuilder->pBitMap); if (pBuilder->pOffC) tCompressorDestroy(pBuilder->pOffC); if (pBuilder->pValC) tCompressorDestroy(pBuilder->pValC); + for (int32_t iBuf = 0; iBuf < sizeof(pBuilder->aBuf) / sizeof(pBuilder->aBuf[0]); iBuf++) { + tFree(pBuilder->aBuf[iBuf]); + } return code; } -static int32_t tDiskColBuilderInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, uint8_t cmprAlg) { +static int32_t tDiskColBuilderInit(SDiskColBuilder *pBuilder, int16_t cid, int8_t type, uint8_t cmprAlg, + uint8_t calcSma) { int32_t code = 0; pBuilder->cid = cid; pBuilder->type = type; - pBuilder->flag = 0; pBuilder->cmprAlg = cmprAlg; + pBuilder->calcSma = IS_VAR_DATA_TYPE(type) ? 0 : calcSma; + pBuilder->flag = 0; pBuilder->nVal = 0; pBuilder->offset = 0; if (IS_VAR_DATA_TYPE(type)) { - if (pBuilder->pOffC == NULL) { - code = tCompressorCreate(&pBuilder->pOffC); - if (code) return code; - } + if (pBuilder->pOffC == NULL && (code = tCompressorCreate(&pBuilder->pOffC))) return code; code = tCompressorInit(pBuilder->pOffC, TSDB_DATA_TYPE_INT, cmprAlg); if (code) return code; } - if (pBuilder->pValC == NULL) { - code = tCompressorCreate(&pBuilder->pValC); - if (code) return code; - } + if (pBuilder->pValC == NULL && (code = tCompressorCreate(&pBuilder->pValC))) return code; code = tCompressorInit(pBuilder->pValC, type, cmprAlg); if (code) return code; + if (pBuilder->calcSma) { + pBuilder->sma = (SColumnDataAgg){.colId = cid}; + pBuilder->minSet = 0; + pBuilder->maxSet = 0; + } + return code; } @@ -91,24 +101,31 @@ static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { ASSERT(pBuilder->flag && pBuilder->flag != HAS_NONE); - pDiskCol->bCol = (SBlockCol){.cid = pBuilder->cid, - .type = pBuilder->type, - .smaOn = 1, /* todo */ - .flag = pBuilder->flag, - .szOrigin = 0, // todo - .szBitmap = 0, // todo - .szOffset = 0, - .szValue = 0, // todo - .offset = 0}; - pDiskCol->pBit = NULL; - pDiskCol->pOff = NULL; - pDiskCol->pVal = NULL; + *pDiskCol = (SDiskCol){(SBlockCol){.cid = pBuilder->cid, + .type = pBuilder->type, + .smaOn = pBuilder->calcSma, + .flag = pBuilder->flag, + .szOrigin = 0, // todo + .szBitmap = 0, + .szOffset = 0, + .szValue = 0, + .offset = 0}, + .pBit = NULL, .pOff = NULL, .pVal = NULL, .agg = pBuilder->sma}; if (pBuilder->flag == HAS_NULL) return code; // BITMAP if (pBuilder->flag != HAS_VALUE) { - // TODO + int32_t nBit; + if (pBuilder->flag == (HAS_VALUE | HAS_NULL | HAS_NONE)) { + nBit = BIT2_SIZE(pBuilder->nVal); + } else { + nBit = BIT1_SIZE(pBuilder->nVal); + } + + pDiskCol->bCol.szBitmap = tsCompressTinyint(pBuilder->pBitMap, nBit, nBit, pBuilder->aBuf[0], 0, pBuilder->cmprAlg, + NULL, 0); // todo: alloc + pDiskCol->pBit = pBuilder->aBuf[0]; } // OFFSET @@ -126,22 +143,114 @@ static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { return code; } -static int32_t tDiskColAddValue(SDiskColBuilder *pBuilder, SColVal *pColVal) { +static FORCE_INLINE void tDiskColUpdateSmaBool(SDiskColBuilder *pBuilder, SColVal *pColVal) { + // TODO +} +static FORCE_INLINE void tDiskColUpdateSmaTinyint(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int8_t val = *(int8_t *)&pColVal->value.val; + pBuilder->sma.sum += val; + if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; + if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; +} +static FORCE_INLINE void tDiskColUpdateSmaSmallint(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int16_t val = *(int16_t *)&pColVal->value.val; + pBuilder->sma.sum += val; + if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; + if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; +} +static FORCE_INLINE void tDiskColUpdateSmaInt(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t val = *(int32_t *)&pColVal->value.val; + pBuilder->sma.sum += val; + if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; + if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; +} +static FORCE_INLINE void tDiskColUpdateBigint(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int64_t val = *(int64_t *)&pColVal->value.val; + pBuilder->sma.sum += val; + if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; + if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; +} +static FORCE_INLINE void tDiskColUpdateFloat(SDiskColBuilder *pBuilder, SColVal *pColVal) { + float val = *(float *)&pColVal->value.val; + *(double *)&pBuilder->sma.sum += val; + if (!pBuilder->minSet || *(double *)&pBuilder->sma.min > val) *(double *)&pBuilder->sma.min = val; + if (!pBuilder->maxSet || *(double *)&pBuilder->sma.max < val) *(double *)&pBuilder->sma.max = val; +} +static FORCE_INLINE void tDiskColUpdateDouble(SDiskColBuilder *pBuilder, SColVal *pColVal) { + double val = *(double *)&pColVal->value.val; + *(double *)&pBuilder->sma.sum += val; + if (!pBuilder->minSet || *(double *)&pBuilder->sma.min > val) *(double *)&pBuilder->sma.min = val; + if (!pBuilder->maxSet || *(double *)&pBuilder->sma.max < val) *(double *)&pBuilder->sma.max = val; +} +static FORCE_INLINE void tDiskColUpdateUTinyint(SDiskColBuilder *pBuilder, SColVal *pColVal) { + uint8_t val = *(uint8_t *)&pColVal->value.val; + pBuilder->sma.sum += val; + if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; + if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; +} +static FORCE_INLINE void tDiskColUpdateUSmallint(SDiskColBuilder *pBuilder, SColVal *pColVal) { + uint16_t val = *(uint16_t *)&pColVal->value.val; + pBuilder->sma.sum += val; + if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; + if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; +} +static FORCE_INLINE void tDiskColUpdateUInt(SDiskColBuilder *pBuilder, SColVal *pColVal) { + uint32_t val = *(uint32_t *)&pColVal->value.val; + pBuilder->sma.sum += val; + if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; + if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; +} +static FORCE_INLINE void tDiskColUpdateUBigint(SDiskColBuilder *pBuilder, SColVal *pColVal) { + uint64_t val = *(uint64_t *)&pColVal->value.val; + pBuilder->sma.sum += val; + if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; + if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; +} +static void (*tDiskColUpdateSmaImpl[])(SDiskColBuilder *pBuilder, SColVal *pColVal) = { + NULL, // TSDB_DATA_TYPE_NULL + tDiskColUpdateSmaBool, // TSDB_DATA_TYPE_BOOL + tDiskColUpdateSmaTinyint, // TSDB_DATA_TYPE_TINYINT + tDiskColUpdateSmaSmallint, // TSDB_DATA_TYPE_SMALLINT + tDiskColUpdateSmaInt, // TSDB_DATA_TYPE_INT + tDiskColUpdateBigint, // TSDB_DATA_TYPE_BIGINT + tDiskColUpdateFloat, // TSDB_DATA_TYPE_FLOAT + tDiskColUpdateDouble, // TSDB_DATA_TYPE_DOUBLE + NULL, // TSDB_DATA_TYPE_VARCHAR + tDiskColUpdateBigint, // TSDB_DATA_TYPE_TIMESTAMP + NULL, // TSDB_DATA_TYPE_NCHAR + tDiskColUpdateUTinyint, // TSDB_DATA_TYPE_UTINYINT + tDiskColUpdateUSmallint, // TSDB_DATA_TYPE_USMALLINT + tDiskColUpdateUInt, // TSDB_DATA_TYPE_UINT + tDiskColUpdateUBigint, // TSDB_DATA_TYPE_UBIGINT + NULL, // TSDB_DATA_TYPE_JSON + NULL, // TSDB_DATA_TYPE_VARBINARY + NULL, // TSDB_DATA_TYPE_DECIMAL + NULL, // TSDB_DATA_TYPE_BLOB + NULL, // TSDB_DATA_TYPE_MEDIUMBLOB +}; +static FORCE_INLINE void tDiskColUpdateSma(SDiskColBuilder *pBuilder, SColVal *pColVal) { + if (pColVal->isNone || pColVal->isNull) { + pBuilder->sma.numOfNull++; + } else { + tDiskColUpdateSmaImpl[pBuilder->type](pBuilder, pColVal); + } +} + +static int32_t tDiskColPutValue(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; if (IS_VAR_DATA_TYPE(pColVal->type)) { code = tCompress(pBuilder->pOffC, &pBuilder->offset, sizeof(int32_t)); - if (code) goto _exit; + if (code) return code; pBuilder->offset += pColVal->value.nData; code = tCompress(pBuilder->pValC, pColVal->value.pData, pColVal->value.nData); - if (code) goto _exit; + if (code) return code; } else { code = tCompress(pBuilder->pValC, &pColVal->value.val, tDataTypes[pColVal->type].bytes); - if (code) goto _exit; + if (code) return code; } -_exit: return code; } static int32_t tDiskColAddVal0(SDiskColBuilder *pBuilder, SColVal *pColVal) { // 0 @@ -153,12 +262,10 @@ static int32_t tDiskColAddVal0(SDiskColBuilder *pBuilder, SColVal *pColVal) { / pBuilder->flag = HAS_NULL; } else { pBuilder->flag = HAS_VALUE; - code = tDiskColAddValue(pBuilder, pColVal); - if (code) goto _exit; + code = tDiskColPutValue(pBuilder, pColVal); + if (code) return code; } - pBuilder->nVal++; -_exit: return code; } static int32_t tDiskColAddVal1(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NONE @@ -169,7 +276,7 @@ static int32_t tDiskColAddVal1(SDiskColBuilder *pBuilder, SColVal *pColVal) { / int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); code = tRealloc(&pBuilder->pBitMap, nBit); - if (code) goto _exit; + if (code) return code; memset(pBuilder->pBitMap, 0, nBit); SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); @@ -182,17 +289,15 @@ static int32_t tDiskColAddVal1(SDiskColBuilder *pBuilder, SColVal *pColVal) { / SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { - code = tDiskColAddValue(pBuilder, &cv); - if (code) goto _exit; + code = tDiskColPutValue(pBuilder, &cv); + if (code) return code; } - code = tDiskColAddValue(pBuilder, pColVal); - if (code) goto _exit; + code = tDiskColPutValue(pBuilder, pColVal); + if (code) return code; } } - pBuilder->nVal++; -_exit: return code; } static int32_t tDiskColAddVal2(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NULL @@ -216,15 +321,14 @@ static int32_t tDiskColAddVal2(SDiskColBuilder *pBuilder, SColVal *pColVal) { / SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { - code = tDiskColAddValue(pBuilder, &cv); + code = tDiskColPutValue(pBuilder, &cv); if (code) goto _exit; } - code = tDiskColAddValue(pBuilder, pColVal); + code = tDiskColPutValue(pBuilder, pColVal); if (code) goto _exit; } } - pBuilder->nVal++; _exit: return code; @@ -259,14 +363,13 @@ static int32_t tDiskColAddVal3(SDiskColBuilder *pBuilder, SColVal *pColVal) { / SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { - code = tDiskColAddValue(pBuilder, &cv); + code = tDiskColPutValue(pBuilder, &cv); if (code) goto _exit; } - code = tDiskColAddValue(pBuilder, pColVal); + code = tDiskColPutValue(pBuilder, pColVal); if (code) goto _exit; } - pBuilder->nVal++; _exit: return code; @@ -288,13 +391,12 @@ static int32_t tDiskColAddVal4(SDiskColBuilder *pBuilder, SColVal *pColVal) { / memset(pBuilder->pBitMap, 255, nBit); SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - code = tDiskColAddValue(pBuilder, pColVal); + code = tDiskColPutValue(pBuilder, pColVal); if (code) goto _exit; } else { - code = tDiskColAddValue(pBuilder, pColVal); + code = tDiskColPutValue(pBuilder, pColVal); if (code) goto _exit; } - pBuilder->nVal++; _exit: return code; @@ -326,9 +428,8 @@ static int32_t tDiskColAddVal5(SDiskColBuilder *pBuilder, SColVal *pColVal) { / SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); } } - code = tDiskColAddValue(pBuilder, pColVal); + code = tDiskColPutValue(pBuilder, pColVal); if (code) goto _exit; - pBuilder->nVal++; _exit: return code; @@ -360,9 +461,8 @@ static int32_t tDiskColAddVal6(SDiskColBuilder *pBuilder, SColVal *pColVal) { / SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); } } - code = tDiskColAddValue(pBuilder, pColVal); + code = tDiskColPutValue(pBuilder, pColVal); if (code) goto _exit; - pBuilder->nVal++; _exit: return code; @@ -380,9 +480,8 @@ static int32_t tDiskColAddVal7(SDiskColBuilder *pBuilder, SColVal *pColVal) { / } else { SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 2); } - code = tDiskColAddValue(pBuilder, pColVal); + code = tDiskColPutValue(pBuilder, pColVal); if (code) goto _exit; - pBuilder->nVal++; _exit: return code; @@ -397,6 +496,18 @@ static int32_t (*tDiskColAddValImpl[])(SDiskColBuilder *pBuilder, SColVal *pColV tDiskColAddVal6, // HAS_VALUE|HAS_NULL tDiskColAddVal7, // HAS_VALUE|HAS_NULL|HAS_NONE }; +static int32_t tDiskColAddVal(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + if (pBuilder->calcSma) tDiskColUpdateSma(pBuilder, pColVal); + + code = tDiskColAddValImpl[pBuilder->type](pBuilder, pColVal); + if (code) return code; + + pBuilder->nVal++; + + return code; +} // SDiskDataBuilder ================================================ int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder) { @@ -477,7 +588,8 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, pBuilder->nBuilder); - code = tDiskColBuilderInit(pDiskColBuilder, pTColumn->colId, pTColumn->type, cmprAlg); + code = tDiskColBuilderInit(pDiskColBuilder, pTColumn->colId, pTColumn->type, cmprAlg, + (calcSma && (pTColumn->flags & COL_SMA_ON))); if (code) return code; pBuilder->nBuilder++; @@ -528,10 +640,10 @@ int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSche if (pColVal == NULL || pColVal->cid > pDCBuilder->cid) { SColVal cv = COL_VAL_NONE(pDCBuilder->cid, pDCBuilder->type); - code = tDiskColAddValImpl[pDCBuilder->flag](pDCBuilder, &cv); + code = tDiskColAddVal(pDCBuilder, &cv); if (code) return code; } else { - code = tDiskColAddValImpl[pDCBuilder->flag](pDCBuilder, pColVal); + code = tDiskColAddVal(pDCBuilder, pColVal); if (code) return code; pColVal = tRowIterNext(&iter); } From 1cac65d8c0092261de98e5371282371eacf83051 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 22 Sep 2022 19:08:33 +0800 Subject: [PATCH 019/143] refact more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 88 +------ source/dnode/vnode/src/tsdb/tsdbUtil.c | 270 ++++++++------------- 2 files changed, 98 insertions(+), 260 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 5a235c5c82..8d25873036 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -143,96 +143,12 @@ static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { return code; } -static FORCE_INLINE void tDiskColUpdateSmaBool(SDiskColBuilder *pBuilder, SColVal *pColVal) { - // TODO -} -static FORCE_INLINE void tDiskColUpdateSmaTinyint(SDiskColBuilder *pBuilder, SColVal *pColVal) { - int8_t val = *(int8_t *)&pColVal->value.val; - pBuilder->sma.sum += val; - if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; - if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; -} -static FORCE_INLINE void tDiskColUpdateSmaSmallint(SDiskColBuilder *pBuilder, SColVal *pColVal) { - int16_t val = *(int16_t *)&pColVal->value.val; - pBuilder->sma.sum += val; - if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; - if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; -} -static FORCE_INLINE void tDiskColUpdateSmaInt(SDiskColBuilder *pBuilder, SColVal *pColVal) { - int32_t val = *(int32_t *)&pColVal->value.val; - pBuilder->sma.sum += val; - if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; - if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; -} -static FORCE_INLINE void tDiskColUpdateBigint(SDiskColBuilder *pBuilder, SColVal *pColVal) { - int64_t val = *(int64_t *)&pColVal->value.val; - pBuilder->sma.sum += val; - if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; - if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; -} -static FORCE_INLINE void tDiskColUpdateFloat(SDiskColBuilder *pBuilder, SColVal *pColVal) { - float val = *(float *)&pColVal->value.val; - *(double *)&pBuilder->sma.sum += val; - if (!pBuilder->minSet || *(double *)&pBuilder->sma.min > val) *(double *)&pBuilder->sma.min = val; - if (!pBuilder->maxSet || *(double *)&pBuilder->sma.max < val) *(double *)&pBuilder->sma.max = val; -} -static FORCE_INLINE void tDiskColUpdateDouble(SDiskColBuilder *pBuilder, SColVal *pColVal) { - double val = *(double *)&pColVal->value.val; - *(double *)&pBuilder->sma.sum += val; - if (!pBuilder->minSet || *(double *)&pBuilder->sma.min > val) *(double *)&pBuilder->sma.min = val; - if (!pBuilder->maxSet || *(double *)&pBuilder->sma.max < val) *(double *)&pBuilder->sma.max = val; -} -static FORCE_INLINE void tDiskColUpdateUTinyint(SDiskColBuilder *pBuilder, SColVal *pColVal) { - uint8_t val = *(uint8_t *)&pColVal->value.val; - pBuilder->sma.sum += val; - if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; - if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; -} -static FORCE_INLINE void tDiskColUpdateUSmallint(SDiskColBuilder *pBuilder, SColVal *pColVal) { - uint16_t val = *(uint16_t *)&pColVal->value.val; - pBuilder->sma.sum += val; - if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; - if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; -} -static FORCE_INLINE void tDiskColUpdateUInt(SDiskColBuilder *pBuilder, SColVal *pColVal) { - uint32_t val = *(uint32_t *)&pColVal->value.val; - pBuilder->sma.sum += val; - if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; - if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; -} -static FORCE_INLINE void tDiskColUpdateUBigint(SDiskColBuilder *pBuilder, SColVal *pColVal) { - uint64_t val = *(uint64_t *)&pColVal->value.val; - pBuilder->sma.sum += val; - if (!pBuilder->minSet || pBuilder->sma.min > val) pBuilder->sma.min = val; - if (!pBuilder->maxSet || pBuilder->sma.max < val) pBuilder->sma.max = val; -} -static void (*tDiskColUpdateSmaImpl[])(SDiskColBuilder *pBuilder, SColVal *pColVal) = { - NULL, // TSDB_DATA_TYPE_NULL - tDiskColUpdateSmaBool, // TSDB_DATA_TYPE_BOOL - tDiskColUpdateSmaTinyint, // TSDB_DATA_TYPE_TINYINT - tDiskColUpdateSmaSmallint, // TSDB_DATA_TYPE_SMALLINT - tDiskColUpdateSmaInt, // TSDB_DATA_TYPE_INT - tDiskColUpdateBigint, // TSDB_DATA_TYPE_BIGINT - tDiskColUpdateFloat, // TSDB_DATA_TYPE_FLOAT - tDiskColUpdateDouble, // TSDB_DATA_TYPE_DOUBLE - NULL, // TSDB_DATA_TYPE_VARCHAR - tDiskColUpdateBigint, // TSDB_DATA_TYPE_TIMESTAMP - NULL, // TSDB_DATA_TYPE_NCHAR - tDiskColUpdateUTinyint, // TSDB_DATA_TYPE_UTINYINT - tDiskColUpdateUSmallint, // TSDB_DATA_TYPE_USMALLINT - tDiskColUpdateUInt, // TSDB_DATA_TYPE_UINT - tDiskColUpdateUBigint, // TSDB_DATA_TYPE_UBIGINT - NULL, // TSDB_DATA_TYPE_JSON - NULL, // TSDB_DATA_TYPE_VARBINARY - NULL, // TSDB_DATA_TYPE_DECIMAL - NULL, // TSDB_DATA_TYPE_BLOB - NULL, // TSDB_DATA_TYPE_MEDIUMBLOB -}; +extern void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet); static FORCE_INLINE void tDiskColUpdateSma(SDiskColBuilder *pBuilder, SColVal *pColVal) { if (pColVal->isNone || pColVal->isNull) { pBuilder->sma.numOfNull++; } else { - tDiskColUpdateSmaImpl[pBuilder->type](pBuilder, pColVal); + tSmaUpdateImpl[pBuilder->type](&pBuilder->sma, pColVal, &pBuilder->minSet, &pBuilder->maxSet); } } diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index c77af951af..0575b30526 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -1492,185 +1492,107 @@ int32_t tGetColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg) { return n; } +#define SMA_UPDATE(SUM_V, MIN_V, MAX_V, VAL, MINSET, MAXSET) \ + do { \ + (SUM_V) += (VAL); \ + if (!(MINSET)) { \ + (MIN_V) = (VAL); \ + (MINSET) = 1; \ + } else if ((MIN_V) > (VAL)) { \ + (MIN_V) = (VAL); \ + } \ + if (!(MAXSET)) { \ + (MAX_V) = (VAL); \ + (MAXSET) = 1; \ + } else if ((MAX_V) < (VAL)) { \ + (MAX_V) = (VAL); \ + } \ + } while (0) + +static FORCE_INLINE void tSmaUpdateBool(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) { + int8_t val = *(int8_t *)&pColVal->value.val ? 1 : 0; + SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateTinyint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, + uint8_t *maxSet) { + int8_t val = *(int8_t *)&pColVal->value.val; + SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateSmallint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, + uint8_t *maxSet) { + int16_t val = *(int16_t *)&pColVal->value.val; + SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateInt(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) { + int32_t val = *(int32_t *)&pColVal->value.val; + SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateBigint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) { + int64_t val = *(int64_t *)&pColVal->value.val; + SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateFloat(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) { + float val = *(float *)&pColVal->value.val; + SMA_UPDATE(*(double *)&pColAgg->sum, *(double *)&pColAgg->min, *(double *)&pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateDouble(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) { + double val = *(double *)&pColVal->value.val; + SMA_UPDATE(*(double *)&pColAgg->sum, *(double *)&pColAgg->min, *(double *)&pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateUTinyint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, + uint8_t *maxSet) { + uint8_t val = *(uint8_t *)&pColVal->value.val; + SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateUSmallint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, + uint8_t *maxSet) { + uint16_t val = *(uint16_t *)&pColVal->value.val; + SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateUInt(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) { + uint32_t val = *(uint32_t *)&pColVal->value.val; + SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet); +} +static FORCE_INLINE void tSmaUpdateUBigint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, + uint8_t *maxSet) { + uint64_t val = *(uint64_t *)&pColVal->value.val; + SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet); +} +void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) = { + NULL, + tSmaUpdateBool, // TSDB_DATA_TYPE_BOOL + tSmaUpdateTinyint, // TSDB_DATA_TYPE_TINYINT + tSmaUpdateSmallint, // TSDB_DATA_TYPE_SMALLINT + tSmaUpdateInt, // TSDB_DATA_TYPE_INT + tSmaUpdateBigint, // TSDB_DATA_TYPE_BIGINT + tSmaUpdateFloat, // TSDB_DATA_TYPE_FLOAT + tSmaUpdateDouble, // TSDB_DATA_TYPE_DOUBLE + NULL, // TSDB_DATA_TYPE_VARCHAR + tSmaUpdateBigint, // TSDB_DATA_TYPE_TIMESTAMP + NULL, // TSDB_DATA_TYPE_NCHAR + tSmaUpdateUTinyint, // TSDB_DATA_TYPE_UTINYINT + tSmaUpdateUSmallint, // TSDB_DATA_TYPE_USMALLINT + tSmaUpdateUInt, // TSDB_DATA_TYPE_UINT + tSmaUpdateUBigint, // TSDB_DATA_TYPE_UBIGINT + NULL, // TSDB_DATA_TYPE_JSON + NULL, // TSDB_DATA_TYPE_VARBINARY + NULL, // TSDB_DATA_TYPE_DECIMAL + NULL, // TSDB_DATA_TYPE_BLOB + NULL, // TSDB_DATA_TYPE_MEDIUMBLOB +}; void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) { - SColVal colVal; - SColVal *pColVal = &colVal; - - memset(pColAgg, 0, sizeof(*pColAgg)); - bool minAssigned = false; - bool maxAssigned = false; - *pColAgg = (SColumnDataAgg){.colId = pColData->cid}; - for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { - tColDataGetValue(pColData, iVal, pColVal); + uint8_t minSet = 0; + uint8_t maxSet = 0; - if (pColVal->isNone || pColVal->isNull) { + SColVal cv; + for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { + tColDataGetValue(pColData, iVal, &cv); + + if (cv.isNone || cv.isNull) { pColAgg->numOfNull++; } else { - switch (pColData->type) { - case TSDB_DATA_TYPE_NULL: - break; - case TSDB_DATA_TYPE_BOOL: - break; - case TSDB_DATA_TYPE_TINYINT: { - int8_t i8 = *(int8_t *)&colVal.value.val; - pColAgg->sum += i8; - if (!minAssigned || pColAgg->min > i8) { - pColAgg->min = i8; - minAssigned = true; - } - if (!maxAssigned || pColAgg->max < i8) { - pColAgg->max = i8; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_SMALLINT: { - int16_t i16 = *(int16_t *)&colVal.value.val; - pColAgg->sum += i16; - if (!minAssigned || pColAgg->min > i16) { - pColAgg->min = i16; - minAssigned = true; - } - if (!maxAssigned || pColAgg->max < i16) { - pColAgg->max = i16; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_INT: { - int32_t i32 = *(int32_t *)&colVal.value.val; - pColAgg->sum += i32; - if (!minAssigned || pColAgg->min > i32) { - pColAgg->min = i32; - minAssigned = true; - } - if (!maxAssigned || pColAgg->max < i32) { - pColAgg->max = i32; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_BIGINT: { - int64_t i64 = *(int64_t *)&colVal.value.val; - pColAgg->sum += i64; - if (!minAssigned || pColAgg->min > i64) { - pColAgg->min = i64; - minAssigned = true; - } - if (!maxAssigned || pColAgg->max < i64) { - pColAgg->max = i64; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_FLOAT: { - float f = *(float *)&colVal.value.val; - *(double *)(&pColAgg->sum) += f; - if (!minAssigned || *(double *)(&pColAgg->min) > f) { - *(double *)(&pColAgg->min) = f; - minAssigned = true; - } - if (!maxAssigned || *(double *)(&pColAgg->max) < f) { - *(double *)(&pColAgg->max) = f; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_DOUBLE: { - double d = *(double *)&colVal.value.val; - *(double *)(&pColAgg->sum) += d; - if (!minAssigned || *(double *)(&pColAgg->min) > d) { - *(double *)(&pColAgg->min) = d; - minAssigned = true; - } - if (!maxAssigned || *(double *)(&pColAgg->max) < d) { - *(double *)(&pColAgg->max) = d; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_VARCHAR: - break; - case TSDB_DATA_TYPE_TIMESTAMP: { - int64_t ts = *(int64_t *)&colVal.value.val; - if (!minAssigned || pColAgg->min > ts) { - pColAgg->min = ts; - minAssigned = true; - } - if (!maxAssigned || pColAgg->max < ts) { - pColAgg->max = ts; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_NCHAR: - break; - case TSDB_DATA_TYPE_UTINYINT: { - uint8_t u8 = *(uint8_t *)&colVal.value.val; - pColAgg->sum += u8; - if (!minAssigned || pColAgg->min > u8) { - pColAgg->min = u8; - minAssigned = true; - } - if (!maxAssigned || pColAgg->max < u8) { - pColAgg->max = u8; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_USMALLINT: { - uint16_t u16 = *(uint16_t *)&colVal.value.val; - pColAgg->sum += u16; - if (!minAssigned || pColAgg->min > u16) { - pColAgg->min = u16; - minAssigned = true; - } - if (!maxAssigned || pColAgg->max < u16) { - pColAgg->max = u16; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_UINT: { - uint32_t u32 = *(uint32_t *)&colVal.value.val; - pColAgg->sum += u32; - if (!minAssigned || pColAgg->min > u32) { - pColAgg->min = u32; - minAssigned = true; - } - if (!minAssigned || pColAgg->max < u32) { - pColAgg->max = u32; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_UBIGINT: { - uint64_t u64 = *(uint64_t *)&colVal.value.val; - pColAgg->sum += u64; - if (!minAssigned || pColAgg->min > u64) { - pColAgg->min = u64; - minAssigned = true; - } - if (!maxAssigned || pColAgg->max < u64) { - pColAgg->max = u64; - maxAssigned = true; - } - break; - } - case TSDB_DATA_TYPE_JSON: - break; - case TSDB_DATA_TYPE_VARBINARY: - break; - case TSDB_DATA_TYPE_DECIMAL: - break; - case TSDB_DATA_TYPE_BLOB: - break; - case TSDB_DATA_TYPE_MEDIUMBLOB: - break; - default: - ASSERT(0); - } + tSmaUpdateImpl[pColData->type](pColAgg, &cv, &minSet, &maxSet); } } } From d789fe6ac84300611965803ee43c483ce10297a7 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 23 Sep 2022 10:40:54 +0800 Subject: [PATCH 020/143] refact commit code --- source/dnode/vnode/src/tsdb/tsdbCommit.c | 483 ++++++++++++----------- 1 file changed, 253 insertions(+), 230 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index a619b9f2e4..3daab532f3 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -115,33 +115,32 @@ int32_t tRowInfoCmprFn(const void *p1, const void *p2) { int32_t tsdbBegin(STsdb *pTsdb) { int32_t code = 0; + int32_t lino = 0; if (!pTsdb) return code; SMemTable *pMemTable; code = tsdbMemTableCreate(pTsdb, &pMemTable); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // lock - code = taosThreadRwlockWrlock(&pTsdb->rwLock); - if (code) { + if ((code = taosThreadRwlockWrlock(&pTsdb->rwLock))) { code = TAOS_SYSTEM_ERROR(code); - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } pTsdb->mem = pMemTable; // unlock - code = taosThreadRwlockUnlock(&pTsdb->rwLock); - if (code) { + if ((code = taosThreadRwlockUnlock(&pTsdb->rwLock))) { code = TAOS_SYSTEM_ERROR(code); - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } - return code; - -_err: - tsdbError("vgId:%d, tsdb begin failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } @@ -149,6 +148,7 @@ int32_t tsdbCommit(STsdb *pTsdb) { if (!pTsdb) return 0; int32_t code = 0; + int32_t lino = 0; SCommitter commith; SMemTable *pMemTable = pTsdb->mem; @@ -164,76 +164,74 @@ int32_t tsdbCommit(STsdb *pTsdb) { // start commit code = tsdbStartCommit(pTsdb, &commith); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // commit impl code = tsdbCommitData(&commith); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tsdbCommitDel(&commith); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // end commit code = tsdbEndCommit(&commith, 0); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); _exit: - return code; - -_err: - tsdbEndCommit(&commith, code); - tsdbError("vgId:%d, failed to commit since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); + if (code) { + tsdbEndCommit(&commith, code); + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitDelStart(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; STsdb *pTsdb = pCommitter->pTsdb; SMemTable *pMemTable = pTsdb->imem; - pCommitter->aDelIdx = taosArrayInit(0, sizeof(SDelIdx)); - if (pCommitter->aDelIdx == NULL) { + if ((pCommitter->aDelIdx = taosArrayInit(0, sizeof(SDelIdx))) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } - pCommitter->aDelData = taosArrayInit(0, sizeof(SDelData)); - if (pCommitter->aDelData == NULL) { + if ((pCommitter->aDelData = taosArrayInit(0, sizeof(SDelData))) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } - pCommitter->aDelIdxN = taosArrayInit(0, sizeof(SDelIdx)); - if (pCommitter->aDelIdxN == NULL) { + if ((pCommitter->aDelIdxN = taosArrayInit(0, sizeof(SDelIdx))) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } SDelFile *pDelFileR = pCommitter->fs.pDelFile; if (pDelFileR) { code = tsdbDelFReaderOpen(&pCommitter->pDelFReader, pDelFileR, pTsdb); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tsdbReadDelIdx(pCommitter->pDelFReader, pCommitter->aDelIdx); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } // prepare new SDelFile wDelFile = {.commitID = pCommitter->commitID, .size = 0, .offset = 0}; code = tsdbDelFWriterOpen(&pCommitter->pDelFWriter, &wDelFile, pTsdb); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); _exit: - tsdbDebug("vgId:%d, commit del start", TD_VID(pTsdb->pVnode)); - return code; - -_err: - tsdbError("vgId:%d, commit del start failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); + if (code) { + tsdbError("vgId:%d, %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + } else { + tsdbDebug("vgId:%d, commit del start", TD_VID(pTsdb->pVnode)); + } return code; } static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDelIdx *pDelIdx) { int32_t code = 0; + int32_t lino = 0; SDelData *pDelData; tb_uid_t suid; tb_uid_t uid; @@ -252,7 +250,7 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel uid = pDelIdx->uid; code = tsdbReadDelData(pCommitter->pDelFReader, pDelIdx, pCommitter->aDelData); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } else { taosArrayClear(pCommitter->aDelData); } @@ -266,62 +264,63 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel for (; pDelData; pDelData = pDelData->pNext) { if (taosArrayPush(pCommitter->aDelData, pDelData) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } } // write code = tsdbWriteDelData(pCommitter->pDelFWriter, pCommitter->aDelData, &delIdx); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // put delIdx if (taosArrayPush(pCommitter->aDelIdxN, &delIdx) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } _exit: - return code; - -_err: - tsdbError("vgId:%d, commit table del failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); + if (code) { + tsdbError("vgId:%d, %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitDelEnd(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; STsdb *pTsdb = pCommitter->pTsdb; code = tsdbWriteDelIdx(pCommitter->pDelFWriter, pCommitter->aDelIdxN); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tsdbUpdateDelFileHdr(pCommitter->pDelFWriter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tsdbFSUpsertDelFile(&pCommitter->fs, &pCommitter->pDelFWriter->fDel); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tsdbDelFWriterClose(&pCommitter->pDelFWriter, 1); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); if (pCommitter->pDelFReader) { code = tsdbDelFReaderClose(&pCommitter->pDelFReader); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } taosArrayDestroy(pCommitter->aDelIdx); taosArrayDestroy(pCommitter->aDelData); taosArrayDestroy(pCommitter->aDelIdxN); - return code; - -_err: - tsdbError("vgId:%d, commit del end failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d, %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } int32_t tsdbUpdateTableSchema(SMeta *pMeta, int64_t suid, int64_t uid, SSkmInfo *pSkmInfo) { int32_t code = 0; + int32_t lino = 0; if (suid) { if (pSkmInfo->suid == suid) { @@ -336,7 +335,7 @@ int32_t tsdbUpdateTableSchema(SMeta *pMeta, int64_t suid, int64_t uid, SSkmInfo pSkmInfo->uid = uid; tTSchemaDestroy(pSkmInfo->pTSchema); code = metaGetTbTSchemaEx(pMeta, suid, uid, -1, &pSkmInfo->pTSchema); - if (code) goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); _exit: return code; @@ -344,6 +343,7 @@ _exit: static int32_t tsdbCommitterUpdateRowSchema(SCommitter *pCommitter, int64_t suid, int64_t uid, int32_t sver) { int32_t code = 0; + int32_t lino = 0; if (pCommitter->skmRow.pTSchema) { if (pCommitter->skmRow.suid == suid) { @@ -359,9 +359,7 @@ static int32_t tsdbCommitterUpdateRowSchema(SCommitter *pCommitter, int64_t suid pCommitter->skmRow.uid = uid; tTSchemaDestroy(pCommitter->skmRow.pTSchema); code = metaGetTbTSchemaEx(pCommitter->pTsdb->pVnode->pMeta, suid, uid, sver, &pCommitter->skmRow.pTSchema); - if (code) { - goto _exit; - } + TSDB_CHECK_CODE(code, lino, _exit); _exit: return code; @@ -369,6 +367,7 @@ _exit: static int32_t tsdbCommitterNextTableData(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; ASSERT(pCommitter->dReader.pBlockIdx); @@ -378,7 +377,7 @@ static int32_t tsdbCommitterNextTableData(SCommitter *pCommitter) { (SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, pCommitter->dReader.iBlockIdx); code = tsdbReadDataBlk(pCommitter->dReader.pReader, pCommitter->dReader.pBlockIdx, &pCommitter->dReader.mBlock); - if (code) goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); ASSERT(pCommitter->dReader.mBlock.nItem > 0); } else { @@ -391,6 +390,7 @@ _exit: static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; pCommitter->pIter = NULL; tRBTreeCreate(&pCommitter->rbt, tRowInfoCmprFn); @@ -431,14 +431,14 @@ static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) { pIter->iStt = iStt; code = tsdbReadSttBlk(pCommitter->dReader.pReader, iStt, pIter->aSttBlk); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); if (taosArrayGetSize(pIter->aSttBlk) == 0) continue; pIter->iSttBlk = 0; SSttBlk *pSttBlk = (SSttBlk *)taosArrayGet(pIter->aSttBlk, 0); code = tsdbReadSttBlock(pCommitter->dReader.pReader, iStt, pSttBlk, &pIter->bData); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); pIter->iRow = 0; pIter->r.suid = pIter->bData.suid; @@ -460,16 +460,18 @@ static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) { } code = tsdbNextCommitRow(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); - return code; - -_err: +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; STsdb *pTsdb = pCommitter->pTsdb; SDFileSet *pRSet = NULL; @@ -484,17 +486,17 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { pRSet = (SDFileSet *)taosArraySearch(pCommitter->fs.aDFileSet, &tDFileSet, tDFileSetCmprFn, TD_EQ); if (pRSet) { code = tsdbDataFReaderOpen(&pCommitter->dReader.pReader, pTsdb, pRSet); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // data code = tsdbReadBlockIdx(pCommitter->dReader.pReader, pCommitter->dReader.aBlockIdx); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); pCommitter->dReader.iBlockIdx = 0; if (taosArrayGetSize(pCommitter->dReader.aBlockIdx) > 0) { pCommitter->dReader.pBlockIdx = (SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, 0); code = tsdbReadDataBlk(pCommitter->dReader.pReader, pCommitter->dReader.pBlockIdx, &pCommitter->dReader.mBlock); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } else { pCommitter->dReader.pBlockIdx = NULL; } @@ -531,7 +533,7 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { } wSet.aSttF[wSet.nSttF - 1] = &fStt; code = tsdbDataFWriterOpen(&pCommitter->dWriter.pWriter, pTsdb, &wSet); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); taosArrayClear(pCommitter->dWriter.aBlockIdx); taosArrayClear(pCommitter->dWriter.aSttBlk); @@ -541,18 +543,18 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { // open iter code = tsdbOpenCommitIter(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); _exit: - return code; - -_err: - tsdbError("vgId:%d, commit file data start failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } int32_t tsdbWriteDataBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SMapData *mDataBlk, int8_t cmprAlg) { int32_t code = 0; + int32_t lino = 0; if (pBlockData->nRow == 0) return code; @@ -586,24 +588,25 @@ int32_t tsdbWriteDataBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SMapDa dataBlk.nSubBlock++; code = tsdbWriteBlockData(pWriter, pBlockData, &dataBlk.aSubBlock[dataBlk.nSubBlock - 1], ((dataBlk.nSubBlock == 1) && !dataBlk.hasDup) ? &dataBlk.smaInfo : NULL, cmprAlg, 0); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // put SDataBlk code = tMapDataPutItem(mDataBlk, &dataBlk, tPutDataBlk); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // clear tBlockDataClear(pBlockData); - return code; - -_err: - tsdbError("vgId:%d tsdb commit data block failed since %s", TD_VID(pWriter->pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } int32_t tsdbWriteSttBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SArray *aSttBlk, int8_t cmprAlg) { int32_t code = 0; + int32_t lino = 0; SSttBlk sstBlk; if (pBlockData->nRow == 0) return code; @@ -626,114 +629,117 @@ int32_t tsdbWriteSttBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SArray // write code = tsdbWriteBlockData(pWriter, pBlockData, &sstBlk.bInfo, NULL, cmprAlg, 1); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // push SSttBlk if (taosArrayPush(aSttBlk, &sstBlk) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } // clear tBlockDataClear(pBlockData); - return code; - -_err: - tsdbError("vgId:%d tsdb commit last block failed since %s", TD_VID(pWriter->pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitFileDataEnd(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; // write aBlockIdx code = tsdbWriteBlockIdx(pCommitter->dWriter.pWriter, pCommitter->dWriter.aBlockIdx); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // write aSttBlk code = tsdbWriteSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.aSttBlk); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // update file header code = tsdbUpdateDFileSetHeader(pCommitter->dWriter.pWriter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // upsert SDFileSet code = tsdbFSUpsertFSet(&pCommitter->fs, &pCommitter->dWriter.pWriter->wSet); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // close and sync code = tsdbDataFWriterClose(&pCommitter->dWriter.pWriter, 1); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); if (pCommitter->dReader.pReader) { code = tsdbDataFReaderClose(&pCommitter->dReader.pReader); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } _exit: - return code; - -_err: - tsdbError("vgId:%d, commit file data end failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbMoveCommitData(SCommitter *pCommitter, TABLEID toTable) { int32_t code = 0; + int32_t lino = 0; while (pCommitter->dReader.pBlockIdx && tTABLEIDCmprFn(pCommitter->dReader.pBlockIdx, &toTable) < 0) { SBlockIdx blockIdx = *pCommitter->dReader.pBlockIdx; code = tsdbWriteDataBlk(pCommitter->dWriter.pWriter, &pCommitter->dReader.mBlock, &blockIdx); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } code = tsdbCommitterNextTableData(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } - return code; - -_err: - tsdbError("vgId:%d tsdb move commit data failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter); static int32_t tsdbCommitFileData(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; STsdb *pTsdb = pCommitter->pTsdb; SMemTable *pMemTable = pTsdb->imem; // commit file data start code = tsdbCommitFileDataStart(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // impl code = tsdbCommitFileDataImpl(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // commit file data end code = tsdbCommitFileDataEnd(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); - return code; - -_err: - tsdbError("vgId:%d, commit file data failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); - tsdbDataFReaderClose(&pCommitter->dReader.pReader); - tsdbDataFWriterClose(&pCommitter->dWriter.pWriter, 0); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbDataFReaderClose(&pCommitter->dReader.pReader); + tsdbDataFWriterClose(&pCommitter->dWriter.pWriter, 0); + } return code; } // ---------------------------------------------------------------------------- static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; memset(pCommitter, 0, sizeof(*pCommitter)); ASSERT(pTsdb->mem && pTsdb->imem == NULL); @@ -754,30 +760,31 @@ static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) { pCommitter->aTbDataP = tsdbMemTableGetTbDataArray(pTsdb->imem); if (pCommitter->aTbDataP == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } code = tsdbFSCopy(pTsdb, &pCommitter->fs); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); - return code; - -_err: - tsdbError("vgId:%d, tsdb start commit failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitDataStart(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; // reader pCommitter->dReader.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx)); if (pCommitter->dReader.aBlockIdx == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); } code = tBlockDataCreate(&pCommitter->dReader.bData); - if (code) goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); // merger for (int32_t iStt = 0; iStt < TSDB_MAX_STT_TRIGGER; iStt++) { @@ -785,33 +792,36 @@ static int32_t tsdbCommitDataStart(SCommitter *pCommitter) { pIter->aSttBlk = taosArrayInit(0, sizeof(SSttBlk)); if (pIter->aSttBlk == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); } code = tBlockDataCreate(&pIter->bData); - if (code) goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); } // writer pCommitter->dWriter.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx)); if (pCommitter->dWriter.aBlockIdx == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); } pCommitter->dWriter.aSttBlk = taosArrayInit(0, sizeof(SSttBlk)); if (pCommitter->dWriter.aSttBlk == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); } code = tBlockDataCreate(&pCommitter->dWriter.bData); - if (code) goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); code = tBlockDataCreate(&pCommitter->dWriter.bDatal); - if (code) goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); _exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } @@ -839,7 +849,9 @@ static void tsdbCommitDataEnd(SCommitter *pCommitter) { } static int32_t tsdbCommitData(SCommitter *pCommitter) { - int32_t code = 0; + int32_t code = 0; + int32_t lino = 0; + STsdb *pTsdb = pCommitter->pTsdb; SMemTable *pMemTable = pTsdb->imem; @@ -848,30 +860,29 @@ static int32_t tsdbCommitData(SCommitter *pCommitter) { // start ==================== code = tsdbCommitDataStart(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // impl ==================== pCommitter->nextKey = pMemTable->minKey; while (pCommitter->nextKey < TSKEY_MAX) { code = tsdbCommitFileData(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } // end ==================== tsdbCommitDataEnd(pCommitter); _exit: - tsdbInfo("vgId:%d, commit data done, nRow:%" PRId64, TD_VID(pTsdb->pVnode), pMemTable->nRow); - return code; - -_err: - tsdbCommitDataEnd(pCommitter); - tsdbError("vgId:%d, commit data failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitDel(SCommitter *pCommitter) { - int32_t code = 0; + int32_t code = 0; + int32_t lino = 0; + STsdb *pTsdb = pCommitter->pTsdb; SMemTable *pMemTable = pTsdb->imem; @@ -882,7 +893,7 @@ static int32_t tsdbCommitDel(SCommitter *pCommitter) { // start code = tsdbCommitDelStart(pCommitter); if (code) { - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } // impl @@ -918,7 +929,7 @@ static int32_t tsdbCommitDel(SCommitter *pCommitter) { _commit_mem_del: code = tsdbCommitTableDel(pCommitter, pTbData, NULL); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); iTbData++; pTbData = (iTbData < nTbData) ? (STbData *)taosArrayGetP(pCommitter->aTbDataP, iTbData) : NULL; @@ -926,7 +937,7 @@ static int32_t tsdbCommitDel(SCommitter *pCommitter) { _commit_disk_del: code = tsdbCommitTableDel(pCommitter, NULL, pDelIdx); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); iDelIdx++; pDelIdx = (iDelIdx < nDelIdx) ? (SDelIdx *)taosArrayGet(pCommitter->aDelIdx, iDelIdx) : NULL; @@ -934,7 +945,7 @@ static int32_t tsdbCommitDel(SCommitter *pCommitter) { _commit_mem_and_disk_del: code = tsdbCommitTableDel(pCommitter, pTbData, pDelIdx); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); iTbData++; pTbData = (iTbData < nTbData) ? (STbData *)taosArrayGetP(pCommitter->aTbDataP, iTbData) : NULL; @@ -945,28 +956,28 @@ static int32_t tsdbCommitDel(SCommitter *pCommitter) { // end code = tsdbCommitDelEnd(pCommitter); - if (code) { - goto _err; - } + TSDB_CHECK_CODE(code, lino, _exit); _exit: - tsdbDebug("vgId:%d, commit del done, nDel:%" PRId64, TD_VID(pTsdb->pVnode), pMemTable->nDel); - return code; - -_err: - tsdbError("vgId:%d, commit del failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + } else { + tsdbDebug("vgId:%d commit del done, nDel:%" PRId64, TD_VID(pTsdb->pVnode), pMemTable->nDel); + } return code; } static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno) { - int32_t code = 0; + int32_t code = 0; + int32_t lino = 0; + STsdb *pTsdb = pCommitter->pTsdb; SMemTable *pMemTable = pTsdb->imem; ASSERT(eno == 0); code = tsdbFSCommit1(pTsdb, &pCommitter->fs); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // lock taosThreadRwlockWrlock(&pTsdb->rwLock); @@ -975,7 +986,7 @@ static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno) { code = tsdbFSCommit2(pTsdb, &pCommitter->fs); if (code) { taosThreadRwlockUnlock(&pTsdb->rwLock); - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } pTsdb->imem = NULL; @@ -987,16 +998,12 @@ static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno) { tsdbFSDestroy(&pCommitter->fs); taosArrayDestroy(pCommitter->aTbDataP); - // if (pCommitter->toMerge) { - // code = tsdbMerge(pTsdb); - // if (code) goto _err; - // } - - tsdbInfo("vgId:%d, tsdb end commit", TD_VID(pTsdb->pVnode)); - return code; - -_err: - tsdbError("vgId:%d, tsdb end commit failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + } else { + tsdbInfo("vgId:%d tsdb end commit", TD_VID(pTsdb->pVnode)); + } return code; } @@ -1008,6 +1015,7 @@ static FORCE_INLINE SRowInfo *tsdbGetCommitRow(SCommitter *pCommitter) { static int32_t tsdbNextCommitRow(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; if (pCommitter->pIter) { SDataIter *pIter = pCommitter->pIter; @@ -1050,7 +1058,7 @@ static int32_t tsdbNextCommitRow(SCommitter *pCommitter) { SSttBlk *pSttBlk = (SSttBlk *)taosArrayGet(pIter->aSttBlk, pIter->iSttBlk); code = tsdbReadSttBlock(pCommitter->dReader.pReader, pIter->iStt, pSttBlk, &pIter->bData); - if (code) goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); pIter->iRow = 0; pIter->r.suid = pIter->bData.suid; @@ -1085,11 +1093,16 @@ static int32_t tsdbNextCommitRow(SCommitter *pCommitter) { } _exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitAheadBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) { - int32_t code = 0; + int32_t code = 0; + int32_t lino = 0; + SBlockData *pBlockData = &pCommitter->dWriter.bData; SRowInfo *pRowInfo = tsdbGetCommitRow(pCommitter); TABLEID id = {.suid = pRowInfo->suid, .uid = pRowInfo->uid}; @@ -1098,13 +1111,13 @@ static int32_t tsdbCommitAheadBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) while (pRowInfo) { ASSERT(pRowInfo->row.type == 0); code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tBlockDataAppendRow(pBlockData, &pRowInfo->row, pCommitter->skmRow.pTSchema, id.uid); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tsdbNextCommitRow(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); pRowInfo = tsdbGetCommitRow(pCommitter); if (pRowInfo) { @@ -1119,29 +1132,31 @@ static int32_t tsdbCommitAheadBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) if (pBlockData->nRow >= pCommitter->maxRow) { code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBlockData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } } code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBlockData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); - return code; - -_err: - tsdbError("vgId:%d, tsdb commit ahead block failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) { - int32_t code = 0; + int32_t code = 0; + int32_t lino = 0; + SRowInfo *pRowInfo = tsdbGetCommitRow(pCommitter); TABLEID id = {.suid = pRowInfo->suid, .uid = pRowInfo->uid}; SBlockData *pBDataR = &pCommitter->dReader.bData; SBlockData *pBDataW = &pCommitter->dWriter.bData; code = tsdbReadDataBlock(pCommitter->dReader.pReader, pDataBlk, pBDataR); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); tBlockDataClear(pBDataW); int32_t iRow = 0; @@ -1152,7 +1167,7 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) int32_t c = tsdbRowCmprFn(pRow, &pRowInfo->row); if (c < 0) { code = tBlockDataAppendRow(pBDataW, pRow, NULL, id.uid); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); iRow++; if (iRow < pBDataR->nRow) { @@ -1163,13 +1178,13 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) } else if (c > 0) { ASSERT(pRowInfo->row.type == 0); code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tBlockDataAppendRow(pBDataW, &pRowInfo->row, pCommitter->skmRow.pTSchema, id.uid); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tsdbNextCommitRow(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); pRowInfo = tsdbGetCommitRow(pCommitter); if (pRowInfo) { @@ -1186,13 +1201,13 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) if (pBDataW->nRow >= pCommitter->maxRow) { code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBDataW, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } } while (pRow) { code = tBlockDataAppendRow(pBDataW, pRow, NULL, id.uid); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); iRow++; if (iRow < pBDataR->nRow) { @@ -1203,22 +1218,24 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) if (pBDataW->nRow >= pCommitter->maxRow) { code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBDataW, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } } code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBDataW, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); - return code; - -_err: - tsdbError("vgId:%d, tsdb commit merge block failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbMergeTableData(SCommitter *pCommitter, TABLEID id) { - int32_t code = 0; + int32_t code = 0; + int32_t lino = 0; + SBlockIdx *pBlockIdx = pCommitter->dReader.pBlockIdx; ASSERT(pBlockIdx == NULL || tTABLEIDCmprFn(pBlockIdx, &id) >= 0); @@ -1237,7 +1254,7 @@ static int32_t tsdbMergeTableData(SCommitter *pCommitter, TABLEID id) { if (c < 0) { code = tMapDataPutItem(&pCommitter->dWriter.mBlock, pDataBlk, tPutDataBlk); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); iBlock++; if (iBlock < pCommitter->dReader.mBlock.nItem) { @@ -1247,13 +1264,13 @@ static int32_t tsdbMergeTableData(SCommitter *pCommitter, TABLEID id) { } } else if (c > 0) { code = tsdbCommitAheadBlock(pCommitter, pDataBlk); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); pRowInfo = tsdbGetCommitRow(pCommitter); if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) pRowInfo = NULL; } else { code = tsdbCommitMergeBlock(pCommitter, pDataBlk); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); iBlock++; if (iBlock < pCommitter->dReader.mBlock.nItem) { @@ -1268,7 +1285,7 @@ static int32_t tsdbMergeTableData(SCommitter *pCommitter, TABLEID id) { while (pDataBlk) { code = tMapDataPutItem(&pCommitter->dWriter.mBlock, pDataBlk, tPutDataBlk); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); iBlock++; if (iBlock < pCommitter->dReader.mBlock.nItem) { @@ -1279,25 +1296,25 @@ static int32_t tsdbMergeTableData(SCommitter *pCommitter, TABLEID id) { } code = tsdbCommitterNextTableData(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } _exit: - return code; - -_err: - tsdbError("vgId:%d tsdb merge table data failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbInitLastBlockIfNeed(SCommitter *pCommitter, TABLEID id) { int32_t code = 0; + int32_t lino = 0; SBlockData *pBDatal = &pCommitter->dWriter.bDatal; if (pBDatal->suid || pBDatal->uid) { if ((pBDatal->suid != id.suid) || (id.suid == 0)) { code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBDatal, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg); - if (code) goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); tBlockDataReset(pBDatal); } } @@ -1306,42 +1323,48 @@ static int32_t tsdbInitLastBlockIfNeed(SCommitter *pCommitter, TABLEID id) { ASSERT(pCommitter->skmTable.suid == id.suid); ASSERT(pCommitter->skmTable.uid == id.uid); code = tBlockDataInit(pBDatal, id.suid, id.suid ? 0 : id.uid, pCommitter->skmTable.pTSchema); - if (code) goto _exit; + TSDB_CHECK_CODE(code, lino, _exit); } _exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; SBlockData *pBData = &pCommitter->dWriter.bData; SBlockData *pBDatal = &pCommitter->dWriter.bDatal; TABLEID id = {.suid = pBData->suid, .uid = pBData->uid}; code = tsdbInitLastBlockIfNeed(pCommitter, id); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); for (int32_t iRow = 0; iRow < pBData->nRow; iRow++) { TSDBROW row = tsdbRowFromBlockData(pBData, iRow); code = tBlockDataAppendRow(pBDatal, &row, NULL, pBData->uid); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); if (pBDatal->nRow >= pCommitter->maxRow) { code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBDatal, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } } - return code; - -_err: +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { int32_t code = 0; + int32_t lino = 0; SRowInfo *pRowInfo = tsdbGetCommitRow(pCommitter); if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) { @@ -1354,7 +1377,7 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { if (pCommitter->toLastOnly) { pBData = &pCommitter->dWriter.bDatal; code = tsdbInitLastBlockIfNeed(pCommitter, id); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } else { pBData = &pCommitter->dWriter.bData; ASSERT(pBData->nRow == 0); @@ -1364,15 +1387,15 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { STSchema *pTSchema = NULL; if (pRowInfo->row.type == 0) { code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); pTSchema = pCommitter->skmRow.pTSchema; } code = tBlockDataAppendRow(pBData, &pRowInfo->row, pTSchema, id.uid); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tsdbNextCommitRow(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); pRowInfo = tsdbGetCommitRow(pCommitter); if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) { @@ -1382,11 +1405,11 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { if (pBData->nRow >= pCommitter->maxRow) { if (pCommitter->toLastOnly) { code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBData, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } else { code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } } } @@ -1394,23 +1417,23 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { if (!pCommitter->toLastOnly && pBData->nRow) { if (pBData->nRow > pCommitter->minRow) { code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } else { code = tsdbAppendLastBlock(pCommitter); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } } _exit: - return code; - -_err: - tsdbError("vgId:%d tsdb commit table data failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { int32_t code = 0; + int32_t lino = 0; SRowInfo *pRowInfo; TABLEID id = {0}; @@ -1420,36 +1443,36 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { id.uid = pRowInfo->uid; code = tsdbMoveCommitData(pCommitter, id); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // start tMapDataReset(&pCommitter->dWriter.mBlock); // impl code = tsdbUpdateTableSchema(pCommitter->pTsdb->pVnode->pMeta, id.suid, id.uid, &pCommitter->skmTable); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tBlockDataInit(&pCommitter->dReader.bData, id.suid, id.uid, pCommitter->skmTable.pTSchema); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tBlockDataInit(&pCommitter->dWriter.bData, id.suid, id.uid, pCommitter->skmTable.pTSchema); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); /* merge with data in .data file */ code = tsdbMergeTableData(pCommitter, id); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); /* handle remain table data */ code = tsdbCommitTableData(pCommitter, id); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); // end if (pCommitter->dWriter.mBlock.nItem > 0) { SBlockIdx blockIdx = {.suid = id.suid, .uid = id.uid}; code = tsdbWriteDataBlk(pCommitter->dWriter.pWriter, &pCommitter->dWriter.mBlock, &blockIdx); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TSDB_CHECK_CODE(code, lino, _exit); } } } @@ -1457,15 +1480,15 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { id.suid = INT64_MAX; id.uid = INT64_MAX; code = tsdbMoveCommitData(pCommitter, id); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); - return code; - -_err: - tsdbError("vgId:%d tsdb commit file data impl failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code)); +_exit: + if (code) { + tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } return code; } From 9624073d8447963b4dc9204ab5f5018c28d8a420 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 23 Sep 2022 10:46:05 +0800 Subject: [PATCH 021/143] refact more code --- source/dnode/vnode/src/tsdb/tsdbCommit.c | 64 +++++++++++++++--------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 3daab532f3..1e2a3d5b52 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -139,7 +139,7 @@ int32_t tsdbBegin(STsdb *pTsdb) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -180,7 +180,7 @@ int32_t tsdbCommit(STsdb *pTsdb) { _exit: if (code) { tsdbEndCommit(&commith, code); - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -222,7 +222,7 @@ static int32_t tsdbCommitDelStart(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d, %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d, %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } else { tsdbDebug("vgId:%d, commit del start", TD_VID(pTsdb->pVnode)); } @@ -280,7 +280,8 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel _exit: if (code) { - tsdbError("vgId:%d, %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d, %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -313,7 +314,8 @@ static int32_t tsdbCommitDelEnd(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d, %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d, %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -464,7 +466,8 @@ static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -547,7 +550,7 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -599,7 +602,7 @@ int32_t tsdbWriteDataBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SMapDa _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -642,7 +645,7 @@ int32_t tsdbWriteSttBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SArray _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -678,7 +681,8 @@ static int32_t tsdbCommitFileDataEnd(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -703,7 +707,8 @@ static int32_t tsdbMoveCommitData(SCommitter *pCommitter, TABLEID toTable) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -729,7 +734,7 @@ static int32_t tsdbCommitFileData(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); tsdbDataFReaderClose(&pCommitter->dReader.pReader); tsdbDataFWriterClose(&pCommitter->dWriter.pWriter, 0); } @@ -767,7 +772,7 @@ static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -820,7 +825,8 @@ static int32_t tsdbCommitDataStart(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -874,7 +880,7 @@ static int32_t tsdbCommitData(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -960,7 +966,7 @@ static int32_t tsdbCommitDel(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } else { tsdbDebug("vgId:%d commit del done, nDel:%" PRId64, TD_VID(pTsdb->pVnode), pMemTable->nDel); } @@ -1000,7 +1006,7 @@ static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } else { tsdbInfo("vgId:%d tsdb end commit", TD_VID(pTsdb->pVnode)); } @@ -1094,7 +1100,8 @@ static int32_t tsdbNextCommitRow(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -1141,7 +1148,8 @@ static int32_t tsdbCommitAheadBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -1227,7 +1235,8 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -1301,7 +1310,8 @@ static int32_t tsdbMergeTableData(SCommitter *pCommitter, TABLEID id) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -1328,7 +1338,8 @@ static int32_t tsdbInitLastBlockIfNeed(SCommitter *pCommitter, TABLEID id) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -1357,7 +1368,8 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -1426,7 +1438,8 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } @@ -1488,7 +1501,8 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tstrerror(code)); } return code; } From da2150a15b3a99c668e9ebb4bd40045ef51cac9d Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 23 Sep 2022 16:45:38 +0800 Subject: [PATCH 022/143] more code 1 --- source/dnode/vnode/src/inc/tsdb.h | 14 ++ source/dnode/vnode/src/tsdb/tsdbCommit.c | 192 ++++++++++++--------- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 14 -- 3 files changed, 120 insertions(+), 100 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index dc218e86e0..36aa5c0804 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -686,6 +686,20 @@ struct SDiskData { SArray *aDiskCol; // SArray }; +struct SDiskDataBuilder { + int64_t suid; + int64_t uid; + int32_t nRow; + uint8_t cmprAlg; + uint8_t calcSma; + SCompressor *pUidC; + SCompressor *pVerC; + SCompressor *pKeyC; + int32_t nBuilder; + SArray *aBuilder; // SArray + uint8_t *aBuf[2]; +}; + int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid, STimeWindow *pTimeWindow, SVersionRange *pVerRange, void *pLoadInfo, const char *idStr); void tMergeTreeAddIter(SMergeTree *pMTree, SLDataIter *pIter); diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 1e2a3d5b52..0ff9ae5085 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -70,12 +70,12 @@ typedef struct { int8_t toLastOnly; }; struct { - SDataFWriter *pWriter; - SArray *aBlockIdx; // SArray - SArray *aSttBlk; // SArray - SMapData mBlock; // SMapData - SBlockData bData; - SBlockData bDatal; + SDataFWriter *pWriter; + SArray *aBlockIdx; // SArray + SArray *aSttBlk; // SArray + SMapData mBlock; // SMapData + SBlockData bData; + SDiskDataBuilder *pBuilder; } dWriter; SSkmInfo skmTable; SSkmInfo skmRow; @@ -139,7 +139,7 @@ int32_t tsdbBegin(STsdb *pTsdb) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -180,7 +180,7 @@ int32_t tsdbCommit(STsdb *pTsdb) { _exit: if (code) { tsdbEndCommit(&commith, code); - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -222,7 +222,7 @@ static int32_t tsdbCommitDelStart(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d, %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } else { tsdbDebug("vgId:%d, commit del start", TD_VID(pTsdb->pVnode)); } @@ -280,7 +280,7 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel _exit: if (code) { - tsdbError("vgId:%d, %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -314,7 +314,7 @@ static int32_t tsdbCommitDelEnd(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d, %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -466,7 +466,7 @@ static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -542,7 +542,6 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { taosArrayClear(pCommitter->dWriter.aSttBlk); tMapDataReset(&pCommitter->dWriter.mBlock); tBlockDataReset(&pCommitter->dWriter.bData); - tBlockDataReset(&pCommitter->dWriter.bDatal); // open iter code = tsdbOpenCommitIter(pCommitter); @@ -550,7 +549,7 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -602,7 +601,7 @@ int32_t tsdbWriteDataBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SMapDa _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -645,7 +644,7 @@ int32_t tsdbWriteSttBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SArray _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -681,7 +680,7 @@ static int32_t tsdbCommitFileDataEnd(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -707,7 +706,7 @@ static int32_t tsdbMoveCommitData(SCommitter *pCommitter, TABLEID toTable) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -734,7 +733,7 @@ static int32_t tsdbCommitFileData(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); tsdbDataFReaderClose(&pCommitter->dReader.pReader); tsdbDataFWriterClose(&pCommitter->dWriter.pWriter, 0); } @@ -772,7 +771,7 @@ static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -820,12 +819,12 @@ static int32_t tsdbCommitDataStart(SCommitter *pCommitter) { code = tBlockDataCreate(&pCommitter->dWriter.bData); TSDB_CHECK_CODE(code, lino, _exit); - code = tBlockDataCreate(&pCommitter->dWriter.bDatal); + code = tDiskDataBuilderCreate(&pCommitter->dWriter.pBuilder); TSDB_CHECK_CODE(code, lino, _exit); _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -849,7 +848,7 @@ static void tsdbCommitDataEnd(SCommitter *pCommitter) { taosArrayDestroy(pCommitter->dWriter.aSttBlk); tMapDataClear(&pCommitter->dWriter.mBlock); tBlockDataDestroy(&pCommitter->dWriter.bData, 1); - tBlockDataDestroy(&pCommitter->dWriter.bDatal, 1); + tDiskDataBuilderDestroy(pCommitter->dWriter.pBuilder); tTSchemaDestroy(pCommitter->skmTable.pTSchema); tTSchemaDestroy(pCommitter->skmRow.pTSchema); } @@ -880,7 +879,7 @@ static int32_t tsdbCommitData(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; } @@ -966,7 +965,7 @@ static int32_t tsdbCommitDel(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } else { tsdbDebug("vgId:%d commit del done, nDel:%" PRId64, TD_VID(pTsdb->pVnode), pMemTable->nDel); } @@ -1006,7 +1005,7 @@ static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code)); } else { tsdbInfo("vgId:%d tsdb end commit", TD_VID(pTsdb->pVnode)); } @@ -1100,7 +1099,7 @@ static int32_t tsdbNextCommitRow(SCommitter *pCommitter) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -1148,7 +1147,7 @@ static int32_t tsdbCommitAheadBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -1235,7 +1234,7 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk) _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -1310,7 +1309,7 @@ static int32_t tsdbMergeTableData(SCommitter *pCommitter, TABLEID id) { _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -1320,25 +1319,26 @@ static int32_t tsdbInitLastBlockIfNeed(SCommitter *pCommitter, TABLEID id) { int32_t code = 0; int32_t lino = 0; - SBlockData *pBDatal = &pCommitter->dWriter.bDatal; - if (pBDatal->suid || pBDatal->uid) { - if ((pBDatal->suid != id.suid) || (id.suid == 0)) { - code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBDatal, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg); + SDiskDataBuilder *pBuilder = pCommitter->dWriter.pBuilder; + if (pBuilder->suid || pBuilder->uid) { + if (!TABLE_SAME_SCHEMA(pBuilder->suid, pBuilder->uid, id.suid, id.uid)) { + // code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBDatal, pCommitter->dWriter.aSttBlk, + // pCommitter->cmprAlg); // todo TSDB_CHECK_CODE(code, lino, _exit); - tBlockDataReset(pBDatal); + // tBlockDataReset(pBDatal); } } - if (!pBDatal->suid && !pBDatal->uid) { + if (!pBuilder->suid && !pBuilder->uid) { ASSERT(pCommitter->skmTable.suid == id.suid); ASSERT(pCommitter->skmTable.uid == id.uid); - code = tBlockDataInit(pBDatal, id.suid, id.suid ? 0 : id.uid, pCommitter->skmTable.pTSchema); + // code = tBlockDataInit(pBDatal, id.suid, id.suid ? 0 : id.uid, pCommitter->skmTable.pTSchema); todo TSDB_CHECK_CODE(code, lino, _exit); } _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -1349,7 +1349,6 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { int32_t lino = 0; SBlockData *pBData = &pCommitter->dWriter.bData; - SBlockData *pBDatal = &pCommitter->dWriter.bDatal; TABLEID id = {.suid = pBData->suid, .uid = pBData->uid}; code = tsdbInitLastBlockIfNeed(pCommitter, id); @@ -1357,18 +1356,20 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { for (int32_t iRow = 0; iRow < pBData->nRow; iRow++) { TSDBROW row = tsdbRowFromBlockData(pBData, iRow); - code = tBlockDataAppendRow(pBDatal, &row, NULL, pBData->uid); + + code = tDiskDataBuilderAddRow(pCommitter->dWriter.pBuilder, &row, NULL, &id); TSDB_CHECK_CODE(code, lino, _exit); - if (pBDatal->nRow >= pCommitter->maxRow) { - code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBDatal, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg); + if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) { + code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, NULL /*TODO */, pCommitter->dWriter.aSttBlk, + pCommitter->cmprAlg); TSDB_CHECK_CODE(code, lino, _exit); } } _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -1385,60 +1386,79 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { if (pRowInfo == NULL) goto _exit; - SBlockData *pBData; if (pCommitter->toLastOnly) { - pBData = &pCommitter->dWriter.bDatal; - code = tsdbInitLastBlockIfNeed(pCommitter, id); - TSDB_CHECK_CODE(code, lino, _exit); - } else { - pBData = &pCommitter->dWriter.bData; - ASSERT(pBData->nRow == 0); - } + // init the data if need - while (pRowInfo) { - STSchema *pTSchema = NULL; - if (pRowInfo->row.type == 0) { - code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); - TSDB_CHECK_CODE(code, lino, _exit); - pTSchema = pCommitter->skmRow.pTSchema; - } - - code = tBlockDataAppendRow(pBData, &pRowInfo->row, pTSchema, id.uid); - TSDB_CHECK_CODE(code, lino, _exit); - - code = tsdbNextCommitRow(pCommitter); - TSDB_CHECK_CODE(code, lino, _exit); - - pRowInfo = tsdbGetCommitRow(pCommitter); - if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) { - pRowInfo = NULL; - } - - if (pBData->nRow >= pCommitter->maxRow) { - if (pCommitter->toLastOnly) { - code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBData, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg); + while (pRowInfo) { + STSchema *pTSchema = NULL; + if (pRowInfo->row.type == 0) { + code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); TSDB_CHECK_CODE(code, lino, _exit); - } else { + pTSchema = pCommitter->skmRow.pTSchema; + } + + code = tDiskDataBuilderAddRow(pCommitter->dWriter.pBuilder, &pRowInfo->row, pTSchema, &id); + TSDB_CHECK_CODE(code, lino, _exit); + + code = tsdbNextCommitRow(pCommitter); + TSDB_CHECK_CODE(code, lino, _exit); + + pRowInfo = tsdbGetCommitRow(pCommitter); + if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) { + pRowInfo = NULL; + } + + if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) { + // code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBData, pCommitter->dWriter.aSttBlk, + // pCommitter->cmprAlg); (todo) + TSDB_CHECK_CODE(code, lino, _exit); + } + } + } else { + SBlockData *pBData = &pCommitter->dWriter.bData; + ASSERT(pBData->nRow == 0); + + while (pRowInfo) { + STSchema *pTSchema = NULL; + if (pRowInfo->row.type == 0) { + code = tsdbCommitterUpdateRowSchema(pCommitter, id.suid, id.uid, TSDBROW_SVERSION(&pRowInfo->row)); + TSDB_CHECK_CODE(code, lino, _exit); + pTSchema = pCommitter->skmRow.pTSchema; + } + + code = tBlockDataAppendRow(pBData, &pRowInfo->row, pTSchema, id.uid); + TSDB_CHECK_CODE(code, lino, _exit); + + code = tsdbNextCommitRow(pCommitter); + TSDB_CHECK_CODE(code, lino, _exit); + + pRowInfo = tsdbGetCommitRow(pCommitter); + if (pRowInfo && (pRowInfo->suid != id.suid || pRowInfo->uid != id.uid)) { + pRowInfo = NULL; + } + + if (pBData->nRow >= pCommitter->maxRow) { code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); TSDB_CHECK_CODE(code, lino, _exit); } } - } - if (!pCommitter->toLastOnly && pBData->nRow) { - if (pBData->nRow > pCommitter->minRow) { - code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); - TSDB_CHECK_CODE(code, lino, _exit); - } else { - code = tsdbAppendLastBlock(pCommitter); - TSDB_CHECK_CODE(code, lino, _exit); + if (pBData->nRow) { + if (pBData->nRow > pCommitter->minRow) { + code = + tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg); + TSDB_CHECK_CODE(code, lino, _exit); + } else { + code = tsdbAppendLastBlock(pCommitter); + TSDB_CHECK_CODE(code, lino, _exit); + } } } _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; @@ -1495,13 +1515,13 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { code = tsdbMoveCommitData(pCommitter, id); TSDB_CHECK_CODE(code, lino, _exit); - code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk, - pCommitter->cmprAlg); + // code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk, + // pCommitter->cmprAlg); TSDB_CHECK_CODE(code, lino, _exit); _exit: if (code) { - tsdbError("vgId:%d %s fail at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pCommitter->pTsdb->pVnode), __func__, lino, tstrerror(code)); } return code; diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 8d25873036..8c7933057d 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -34,20 +34,6 @@ struct SDiskColBuilder { uint8_t *aBuf[1]; }; -struct SDiskDataBuilder { - int64_t suid; - int64_t uid; - int32_t nRow; - uint8_t cmprAlg; - uint8_t calcSma; - SCompressor *pUidC; - SCompressor *pVerC; - SCompressor *pKeyC; - int32_t nBuilder; - SArray *aBuilder; // SArray - uint8_t *aBuf[2]; -}; - // SDiskColBuilder ================================================ #define tDiskColBuilderCreate() \ (SDiskColBuilder) { 0 } From 8ff1eb41d1a17614bdc4382444a82d1e83c0e4ae Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 23 Sep 2022 17:13:14 +0800 Subject: [PATCH 023/143] more code --- source/dnode/vnode/src/inc/tsdb.h | 1 + source/dnode/vnode/src/tsdb/tsdbCommit.c | 58 +++++++++++++++++++----- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 36aa5c0804..618364d20f 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -698,6 +698,7 @@ struct SDiskDataBuilder { int32_t nBuilder; SArray *aBuilder; // SArray uint8_t *aBuf[2]; + SDiskData dd; }; int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid, diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 0ff9ae5085..70251933d5 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -649,6 +649,45 @@ _exit: return code; } +static int32_t tsdbCommitSttBlk(SDataFWriter *pWriter, SDiskDataBuilder *pBuilder, SArray *aSttBlk) { + int32_t code = 0; + int32_t lino = 0; + + if (pBuilder->nRow == 0) return code; + + SSttBlk sttBlk = {.suid = pBuilder->suid, + .minUid = 0, // todo + .maxUid = 0, // todo + .minKey = 0, // todo + .maxKey = 0, // todo + .minVer = 0, // todo + .maxVer = 0, // todo + .nRow = pBuilder->nRow}; + + // gnrt + code = tGnrtDiskData(pBuilder, &pBuilder->dd); + TSDB_CHECK_CODE(code, lino, _exit); + + // write + // code = tsdbWriteDiskData(pWriter, &pBuilder->dd); + TSDB_CHECK_CODE(code, lino, _exit); + + // push + if (taosArrayPush(aSttBlk, &sttBlk) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + TSDB_CHECK_CODE(code, lino, _exit); + } + + // clear (todo) + // tDiskDataBuilderClear(pBuilder); + +_exit: + if (code) { + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); + } + return code; +} + static int32_t tsdbCommitFileDataEnd(SCommitter *pCommitter) { int32_t code = 0; int32_t lino = 0; @@ -1315,24 +1354,22 @@ _exit: return code; } -static int32_t tsdbInitLastBlockIfNeed(SCommitter *pCommitter, TABLEID id) { +static int32_t tsdbInitSttBlockBuilderIfNeed(SCommitter *pCommitter, TABLEID id) { int32_t code = 0; int32_t lino = 0; SDiskDataBuilder *pBuilder = pCommitter->dWriter.pBuilder; if (pBuilder->suid || pBuilder->uid) { if (!TABLE_SAME_SCHEMA(pBuilder->suid, pBuilder->uid, id.suid, id.uid)) { - // code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBDatal, pCommitter->dWriter.aSttBlk, - // pCommitter->cmprAlg); // todo + code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pBuilder, pCommitter->dWriter.aSttBlk); TSDB_CHECK_CODE(code, lino, _exit); - // tBlockDataReset(pBDatal); } } if (!pBuilder->suid && !pBuilder->uid) { ASSERT(pCommitter->skmTable.suid == id.suid); ASSERT(pCommitter->skmTable.uid == id.uid); - // code = tBlockDataInit(pBDatal, id.suid, id.suid ? 0 : id.uid, pCommitter->skmTable.pTSchema); todo + code = tDiskDataBuilderInit(pBuilder, pCommitter->skmTable.pTSchema, &id, pCommitter->cmprAlg, 0); TSDB_CHECK_CODE(code, lino, _exit); } @@ -1351,7 +1388,7 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { SBlockData *pBData = &pCommitter->dWriter.bData; TABLEID id = {.suid = pBData->suid, .uid = pBData->uid}; - code = tsdbInitLastBlockIfNeed(pCommitter, id); + code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id); TSDB_CHECK_CODE(code, lino, _exit); for (int32_t iRow = 0; iRow < pBData->nRow; iRow++) { @@ -1361,8 +1398,7 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { TSDB_CHECK_CODE(code, lino, _exit); if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) { - code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, NULL /*TODO */, pCommitter->dWriter.aSttBlk, - pCommitter->cmprAlg); + code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk); TSDB_CHECK_CODE(code, lino, _exit); } } @@ -1409,8 +1445,7 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { } if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) { - // code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBData, pCommitter->dWriter.aSttBlk, - // pCommitter->cmprAlg); (todo) + code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk); TSDB_CHECK_CODE(code, lino, _exit); } } @@ -1515,8 +1550,7 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { code = tsdbMoveCommitData(pCommitter, id); TSDB_CHECK_CODE(code, lino, _exit); - // code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk, - // pCommitter->cmprAlg); + code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, &pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk); TSDB_CHECK_CODE(code, lino, _exit); _exit: From b682fdd261282e88d579b8f2a7bfda2fd20499b7 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 23 Sep 2022 17:57:38 +0800 Subject: [PATCH 024/143] more code --- source/dnode/vnode/src/tsdb/tsdbCommit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 70251933d5..2817e26078 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -1550,7 +1550,7 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { code = tsdbMoveCommitData(pCommitter, id); TSDB_CHECK_CODE(code, lino, _exit); - code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, &pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk); + code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk); TSDB_CHECK_CODE(code, lino, _exit); _exit: From f24c8fbe560e644e7e95cc2b050acb5bc9df9517 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 23 Sep 2022 19:03:29 +0800 Subject: [PATCH 025/143] make it compile --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 34 +++++++++++----------- source/dnode/vnode/src/tsdb/tsdbUtil.c | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 8c7933057d..2c1d6d2149 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -131,7 +131,7 @@ static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { extern void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet); static FORCE_INLINE void tDiskColUpdateSma(SDiskColBuilder *pBuilder, SColVal *pColVal) { - if (pColVal->isNone || pColVal->isNull) { + if (!COL_VAL_IS_VALUE(pColVal)) { pBuilder->sma.numOfNull++; } else { tSmaUpdateImpl[pBuilder->type](&pBuilder->sma, pColVal, &pBuilder->minSet, &pBuilder->maxSet); @@ -158,9 +158,9 @@ static int32_t tDiskColPutValue(SDiskColBuilder *pBuilder, SColVal *pColVal) { static int32_t tDiskColAddVal0(SDiskColBuilder *pBuilder, SColVal *pColVal) { // 0 int32_t code = 0; - if (pColVal->isNone) { + if (COL_VAL_IS_NONE(pColVal)) { pBuilder->flag = HAS_NONE; - } else if (pColVal->isNull) { + } else if (COL_VAL_IS_NULL(pColVal)) { pBuilder->flag = HAS_NULL; } else { pBuilder->flag = HAS_VALUE; @@ -173,7 +173,7 @@ static int32_t tDiskColAddVal0(SDiskColBuilder *pBuilder, SColVal *pColVal) { / static int32_t tDiskColAddVal1(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NONE int32_t code = 0; - if (!pColVal->isNone) { + if (!COL_VAL_IS_NONE(pColVal)) { // bit map int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); @@ -184,7 +184,7 @@ static int32_t tDiskColAddVal1(SDiskColBuilder *pBuilder, SColVal *pColVal) { / SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); // value - if (pColVal->isNull) { + if (COL_VAL_IS_NULL(pColVal)) { pBuilder->flag |= HAS_NULL; } else { pBuilder->flag |= HAS_VALUE; @@ -205,12 +205,12 @@ static int32_t tDiskColAddVal1(SDiskColBuilder *pBuilder, SColVal *pColVal) { / static int32_t tDiskColAddVal2(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NULL int32_t code = 0; - if (!pColVal->isNull) { + if (!COL_VAL_IS_NULL(pColVal)) { int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); code = tRealloc(&pBuilder->pBitMap, nBit); if (code) goto _exit; - if (pColVal->isNone) { + if (COL_VAL_IS_NONE(pColVal)) { pBuilder->flag |= HAS_NONE; memset(pBuilder->pBitMap, 255, nBit); @@ -238,12 +238,12 @@ _exit: static int32_t tDiskColAddVal3(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NULL|HAS_NONE int32_t code = 0; - if (pColVal->isNone) { + if (COL_VAL_IS_NONE(pColVal)) { code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - } else if (pColVal->isNull) { + } else if (COL_VAL_IS_NULL(pColVal)) { code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; @@ -279,8 +279,8 @@ _exit: static int32_t tDiskColAddVal4(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE int32_t code = 0; - if (pColVal->isNone || pColVal->isNull) { - if (pColVal->isNone) { + if (!COL_VAL_IS_VALUE(pColVal)) { + if (COL_VAL_IS_NONE(pColVal)) { pBuilder->flag |= HAS_NONE; } else { pBuilder->flag |= HAS_NULL; @@ -306,7 +306,7 @@ _exit: static int32_t tDiskColAddVal5(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE|HAS_NONE int32_t code = 0; - if (pColVal->isNull) { + if (COL_VAL_IS_NULL(pColVal)) { pBuilder->flag |= HAS_NULL; uint8_t *pBitMap = NULL; @@ -324,7 +324,7 @@ static int32_t tDiskColAddVal5(SDiskColBuilder *pBuilder, SColVal *pColVal) { / code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; - if (pColVal->isNone) { + if (COL_VAL_IS_NONE(pColVal)) { SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); } else { SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); @@ -339,7 +339,7 @@ _exit: static int32_t tDiskColAddVal6(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE|HAS_NULL int32_t code = 0; - if (pColVal->isNone) { + if (COL_VAL_IS_NONE(pColVal)) { pBuilder->flag |= HAS_NONE; uint8_t *pBitMap = NULL; @@ -357,7 +357,7 @@ static int32_t tDiskColAddVal6(SDiskColBuilder *pBuilder, SColVal *pColVal) { / code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; - if (pColVal->isNull) { + if (COL_VAL_IS_NULL(pColVal)) { SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); } else { SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); @@ -375,9 +375,9 @@ static int32_t tDiskColAddVal7(SDiskColBuilder *pBuilder, SColVal *pColVal) { / code = tRealloc(&pBuilder->pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); if (code) goto _exit; - if (pColVal->isNone) { + if (COL_VAL_IS_NONE(pColVal)) { SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 0); - } else if (pColVal->isNull) { + } else if (COL_VAL_IS_NULL(pColVal)) { SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 1); } else { SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 2); diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index ad99b04e5f..1d7eff9a08 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -1589,7 +1589,7 @@ void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) { for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { tColDataGetValue(pColData, iVal, &cv); - if (cv.isNone || cv.isNull) { + if (!COL_VAL_IS_VALUE(&cv)) { pColAgg->numOfNull++; } else { tSmaUpdateImpl[pColData->type](pColAgg, &cv, &minSet, &maxSet); From 64434678cafe142410172543947b0c61d07b32c0 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Sun, 25 Sep 2022 18:09:54 +0800 Subject: [PATCH 026/143] refact more code --- source/util/src/tcompression.c | 87 ++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 20 deletions(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 619ae8360d..3a6dbd4acc 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1001,38 +1001,49 @@ int32_t tsDecompressDoubleLossyImp(const char *input, int32_t compressedSize, co *************************************************************************/ #define I64_SAFE_ADD(a, b) (((a) >= 0 && (b) <= INT64_MAX - (b)) || ((a) < 0 && (b) >= INT64_MIN - (a))) +static int32_t tCompBoolInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompBool(SCompressor *pCmprsor, const void *pData, int32_t nData); +static int32_t tCompIntInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData); +static int32_t tCompFloatInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nData); +static int32_t tCompDoubleInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nData); +static int32_t tCompTimestampInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompTimestamp(SCompressor *pCmprsor, const void *pData, int32_t nData); +static int32_t tCompBinaryInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nData); static struct { int8_t type; int32_t bytes; int8_t isVarLen; + int32_t (*initFn)(SCompressor *, int8_t type, int8_t cmprAlg); int32_t (*cmprFn)(SCompressor *, const void *, int32_t nData); } DATA_TYPE_INFO[] = { - {TSDB_DATA_TYPE_NULL, 0, 0, NULL}, // TSDB_DATA_TYPE_NULL - {TSDB_DATA_TYPE_BOOL, 1, 0, tCompBool}, // TSDB_DATA_TYPE_BOOL - {TSDB_DATA_TYPE_TINYINT, 1, 0, tCompInt}, // TSDB_DATA_TYPE_TINYINT - {TSDB_DATA_TYPE_SMALLINT, 2, 0, tCompInt}, // TSDB_DATA_TYPE_SMALLINT - {TSDB_DATA_TYPE_INT, 4, 0, tCompInt}, // TSDB_DATA_TYPE_INT - {TSDB_DATA_TYPE_BIGINT, 8, 0, tCompInt}, // TSDB_DATA_TYPE_BIGINT - {TSDB_DATA_TYPE_FLOAT, 4, 0, tCompFloat}, // TSDB_DATA_TYPE_FLOAT - {TSDB_DATA_TYPE_DOUBLE, 8, 0, tCompDouble}, // TSDB_DATA_TYPE_DOUBLE - {TSDB_DATA_TYPE_VARCHAR, 1, 1, tCompBinary}, // TSDB_DATA_TYPE_VARCHAR - {TSDB_DATA_TYPE_TIMESTAMP, 8, 0, tCompTimestamp}, // pTSDB_DATA_TYPE_TIMESTAMP - {TSDB_DATA_TYPE_NCHAR, 1, 1, tCompBinary}, // TSDB_DATA_TYPE_NCHAR - {TSDB_DATA_TYPE_UTINYINT, 1, 0, tCompInt}, // TSDB_DATA_TYPE_UTINYINT - {TSDB_DATA_TYPE_USMALLINT, 2, 0, tCompInt}, // TSDB_DATA_TYPE_USMALLINT - {TSDB_DATA_TYPE_UINT, 4, 0, tCompInt}, // TSDB_DATA_TYPE_UINT - {TSDB_DATA_TYPE_UBIGINT, 8, 0, tCompInt}, // TSDB_DATA_TYPE_UBIGINT - {TSDB_DATA_TYPE_JSON, 1, 1, tCompBinary}, // TSDB_DATA_TYPE_JSON - {TSDB_DATA_TYPE_VARBINARY, 1, 1, tCompBinary}, // TSDB_DATA_TYPE_VARBINARY - {TSDB_DATA_TYPE_DECIMAL, 1, 1, tCompBinary}, // TSDB_DATA_TYPE_DECIMAL - {TSDB_DATA_TYPE_BLOB, 1, 1, tCompBinary}, // TSDB_DATA_TYPE_BLOB - {TSDB_DATA_TYPE_MEDIUMBLOB, 1, 1, tCompBinary}, // TSDB_DATA_TYPE_MEDIUMBLOB + {.type = TSDB_DATA_TYPE_NULL, .bytes = 0, .isVarLen = 0, .initFn = NULL, .cmprFn = NULL}, // TSDB_DATA_TYPE_NULL + {.type = TSDB_DATA_TYPE_BOOL, .bytes = 1, .isVarLen = 0, .initFn = tCompBoolInit, .cmprFn = tCompBool}, + {.type = TSDB_DATA_TYPE_TINYINT, .bytes = 1, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, + {.type = TSDB_DATA_TYPE_SMALLINT, .bytes = 2, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, + {.type = TSDB_DATA_TYPE_INT, .bytes = 4, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, + {.type = TSDB_DATA_TYPE_BIGINT, .bytes = 8, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, + {.type = TSDB_DATA_TYPE_FLOAT, .bytes = 4, .isVarLen = 0, .initFn = tCompFloatInit, .cmprFn = tCompFloat}, + {.type = TSDB_DATA_TYPE_DOUBLE, .bytes = 8, .isVarLen = 0, .initFn = tCompDoubleInit, .cmprFn = tCompDouble}, + {.type = TSDB_DATA_TYPE_VARCHAR, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, + {.type = TSDB_DATA_TYPE_TIMESTAMP, + .bytes = 8, + .isVarLen = 0, + .initFn = tCompTimestampInit, + .cmprFn = tCompTimestamp}, + {.type = TSDB_DATA_TYPE_NCHAR, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, + {.type = TSDB_DATA_TYPE_UTINYINT, .bytes = 1, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, + {.type = TSDB_DATA_TYPE_USMALLINT, .bytes = 2, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, + {.type = TSDB_DATA_TYPE_UINT, .bytes = 4, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, + {.type = TSDB_DATA_TYPE_UBIGINT, .bytes = 8, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, + {.type = TSDB_DATA_TYPE_JSON, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, + {.type = TSDB_DATA_TYPE_VARBINARY, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, + {.type = TSDB_DATA_TYPE_DECIMAL, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, + {.type = TSDB_DATA_TYPE_BLOB, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, + {.type = TSDB_DATA_TYPE_MEDIUMBLOB, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, }; struct SCompressor { @@ -1072,6 +1083,12 @@ struct SCompressor { }; // Timestamp ===================================================== +static int32_t tCompTimestampInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { + int32_t code = 0; + // TODO + return code; +} + static int32_t tCompSetCopyMode(SCompressor *pCmprsor) { int32_t code = 0; @@ -1207,6 +1224,12 @@ static const uint8_t BIT_TO_SELECTOR[] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}; +static int32_t tCompIntInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { + int32_t code = 0; + // TODO + return code; +} + static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; @@ -1314,6 +1337,12 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) } // Float ===================================================== +static int32_t tCompFloatInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { + int32_t code = 0; + // TODO + return code; +} + static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; @@ -1377,6 +1406,12 @@ static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nDat } // Double ===================================================== +static int32_t tCompDoubleInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { + int32_t code = 0; + // TODO + return code; +} + static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; @@ -1440,6 +1475,12 @@ static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nDa } // Binary ===================================================== +static int32_t tCompBinaryInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { + int32_t code = 0; + // TODO + return code; +} + static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; @@ -1460,6 +1501,12 @@ static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nDa // Bool ===================================================== static const uint8_t BOOL_CMPR_TABLE[] = {0b01, 0b0100, 0b010000, 0b01000000}; +static int32_t tCompBoolInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { + int32_t code = 0; + // TODO + return code; +} + static int32_t tCompBool(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; From efacafde33d065c9942ad58d02d100b4d03f1afa Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 26 Sep 2022 10:47:24 +0800 Subject: [PATCH 027/143] refact more code --- include/util/tcompression.h | 4 +- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 20 +- source/util/src/tcompression.c | 316 ++++++++++++++------- 3 files changed, 219 insertions(+), 121 deletions(-) diff --git a/include/util/tcompression.h b/include/util/tcompression.h index f22205d144..8f3d9634ec 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -130,8 +130,8 @@ typedef struct SCompressor SCompressor; int32_t tCompressorCreate(SCompressor **ppCmprsor); int32_t tCompressorDestroy(SCompressor *pCmprsor); -int32_t tCompressorInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); -int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); +int32_t tCompressStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); +int32_t tCompressEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); int32_t tCompress(SCompressor *pCmprsor, const void *pData, int64_t nData); #ifdef __cplusplus diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 2c1d6d2149..9e7e4cefe0 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -65,12 +65,12 @@ static int32_t tDiskColBuilderInit(SDiskColBuilder *pBuilder, int16_t cid, int8_ if (IS_VAR_DATA_TYPE(type)) { if (pBuilder->pOffC == NULL && (code = tCompressorCreate(&pBuilder->pOffC))) return code; - code = tCompressorInit(pBuilder->pOffC, TSDB_DATA_TYPE_INT, cmprAlg); + code = tCompressStart(pBuilder->pOffC, TSDB_DATA_TYPE_INT, cmprAlg); if (code) return code; } if (pBuilder->pValC == NULL && (code = tCompressorCreate(&pBuilder->pValC))) return code; - code = tCompressorInit(pBuilder->pValC, type, cmprAlg); + code = tCompressStart(pBuilder->pValC, type, cmprAlg); if (code) return code; if (pBuilder->calcSma) { @@ -116,13 +116,13 @@ static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { // OFFSET if (IS_VAR_DATA_TYPE(pBuilder->type)) { - code = tCompGen(pBuilder->pOffC, &pDiskCol->pOff, &pDiskCol->bCol.szOffset); + code = tCompressEnd(pBuilder->pOffC, &pDiskCol->pOff, &pDiskCol->bCol.szOffset); if (code) return code; } // VALUE if (pBuilder->flag != (HAS_NULL | HAS_NONE)) { - code = tCompGen(pBuilder->pValC, &pDiskCol->pVal, &pDiskCol->bCol.szValue); + code = tCompressEnd(pBuilder->pValC, &pDiskCol->pVal, &pDiskCol->bCol.szValue); if (code) return code; } @@ -457,15 +457,15 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB pBuilder->calcSma = calcSma; if (pBuilder->pUidC == NULL && (code = tCompressorCreate(&pBuilder->pUidC))) return code; - code = tCompressorInit(pBuilder->pUidC, TSDB_DATA_TYPE_BIGINT, cmprAlg); + code = tCompressStart(pBuilder->pUidC, TSDB_DATA_TYPE_BIGINT, cmprAlg); if (code) return code; if (pBuilder->pVerC == NULL && (code = tCompressorCreate(&pBuilder->pVerC))) return code; - code = tCompressorInit(pBuilder->pVerC, TSDB_DATA_TYPE_BIGINT, cmprAlg); + code = tCompressStart(pBuilder->pVerC, TSDB_DATA_TYPE_BIGINT, cmprAlg); if (code) return code; if (pBuilder->pKeyC == NULL && (code = tCompressorCreate(&pBuilder->pKeyC))) return code; - code = tCompressorInit(pBuilder->pKeyC, TSDB_DATA_TYPE_TIMESTAMP, cmprAlg); + code = tCompressStart(pBuilder->pKeyC, TSDB_DATA_TYPE_TIMESTAMP, cmprAlg); if (code) return code; if (pBuilder->aBuilder == NULL) { @@ -586,16 +586,16 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { // UID if (pBuilder->uid == 0) { - code = tCompGen(pBuilder->pUidC, &pDiskData->pUid, &pDiskData->hdr.szUid); + code = tCompressEnd(pBuilder->pUidC, &pDiskData->pUid, &pDiskData->hdr.szUid); if (code) return code; } // VERSION - code = tCompGen(pBuilder->pVerC, &pDiskData->pVer, &pDiskData->hdr.szVer); + code = tCompressEnd(pBuilder->pVerC, &pDiskData->pVer, &pDiskData->hdr.szVer); if (code) return code; // TSKEY - code = tCompGen(pBuilder->pKeyC, &pDiskData->pKey, &pDiskData->hdr.szKey); + code = tCompressEnd(pBuilder->pKeyC, &pDiskData->pKey, &pDiskData->hdr.szKey); if (code) return code; int32_t offset = 0; diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 3a6dbd4acc..f1d9b860b8 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1001,49 +1001,157 @@ int32_t tsDecompressDoubleLossyImp(const char *input, int32_t compressedSize, co *************************************************************************/ #define I64_SAFE_ADD(a, b) (((a) >= 0 && (b) <= INT64_MAX - (b)) || ((a) < 0 && (b) >= INT64_MIN - (a))) -static int32_t tCompBoolInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); +static int32_t tCompBoolStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompBool(SCompressor *pCmprsor, const void *pData, int32_t nData); -static int32_t tCompIntInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); +static int32_t tCompBoolEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); + +static int32_t tCompIntStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData); -static int32_t tCompFloatInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); +static int32_t tCompIntEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); + +static int32_t tCompFloatStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nData); -static int32_t tCompDoubleInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); +static int32_t tCompFloatEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); + +static int32_t tCompDoubleStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nData); -static int32_t tCompTimestampInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); +static int32_t tCompDoubleEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); + +static int32_t tCompTimestampStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompTimestamp(SCompressor *pCmprsor, const void *pData, int32_t nData); -static int32_t tCompBinaryInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); +static int32_t tCompTimestampEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); + +static int32_t tCompBinaryStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nData); +static int32_t tCompBinaryEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); static struct { int8_t type; int32_t bytes; int8_t isVarLen; - int32_t (*initFn)(SCompressor *, int8_t type, int8_t cmprAlg); + int32_t (*startFn)(SCompressor *, int8_t type, int8_t cmprAlg); int32_t (*cmprFn)(SCompressor *, const void *, int32_t nData); + int32_t (*endFn)(SCompressor *, const uint8_t **, int32_t *); } DATA_TYPE_INFO[] = { - {.type = TSDB_DATA_TYPE_NULL, .bytes = 0, .isVarLen = 0, .initFn = NULL, .cmprFn = NULL}, // TSDB_DATA_TYPE_NULL - {.type = TSDB_DATA_TYPE_BOOL, .bytes = 1, .isVarLen = 0, .initFn = tCompBoolInit, .cmprFn = tCompBool}, - {.type = TSDB_DATA_TYPE_TINYINT, .bytes = 1, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, - {.type = TSDB_DATA_TYPE_SMALLINT, .bytes = 2, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, - {.type = TSDB_DATA_TYPE_INT, .bytes = 4, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, - {.type = TSDB_DATA_TYPE_BIGINT, .bytes = 8, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, - {.type = TSDB_DATA_TYPE_FLOAT, .bytes = 4, .isVarLen = 0, .initFn = tCompFloatInit, .cmprFn = tCompFloat}, - {.type = TSDB_DATA_TYPE_DOUBLE, .bytes = 8, .isVarLen = 0, .initFn = tCompDoubleInit, .cmprFn = tCompDouble}, - {.type = TSDB_DATA_TYPE_VARCHAR, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, + {.type = TSDB_DATA_TYPE_NULL, + .bytes = 0, + .isVarLen = 0, + .startFn = NULL, + .cmprFn = NULL, + .endFn = NULL}, // TSDB_DATA_TYPE_NULL + {.type = TSDB_DATA_TYPE_BOOL, + .bytes = 1, + .isVarLen = 0, + .startFn = tCompBoolStart, + .cmprFn = tCompBool, + .endFn = tCompBoolEnd}, + {.type = TSDB_DATA_TYPE_TINYINT, + .bytes = 1, + .isVarLen = 0, + .startFn = tCompIntStart, + .cmprFn = tCompInt, + .endFn = tCompIntEnd}, + {.type = TSDB_DATA_TYPE_SMALLINT, + .bytes = 2, + .isVarLen = 0, + .startFn = tCompIntStart, + .cmprFn = tCompInt, + .endFn = tCompIntEnd}, + {.type = TSDB_DATA_TYPE_INT, + .bytes = 4, + .isVarLen = 0, + .startFn = tCompIntStart, + .cmprFn = tCompInt, + .endFn = tCompIntEnd}, + {.type = TSDB_DATA_TYPE_BIGINT, + .bytes = 8, + .isVarLen = 0, + .startFn = tCompIntStart, + .cmprFn = tCompInt, + .endFn = tCompIntEnd}, + {.type = TSDB_DATA_TYPE_FLOAT, + .bytes = 4, + .isVarLen = 0, + .startFn = tCompFloatStart, + .cmprFn = tCompFloat, + .endFn = tCompFloatEnd}, + {.type = TSDB_DATA_TYPE_DOUBLE, + .bytes = 8, + .isVarLen = 0, + .startFn = tCompDoubleStart, + .cmprFn = tCompDouble, + .endFn = tCompDoubleEnd}, + {.type = TSDB_DATA_TYPE_VARCHAR, + .bytes = 1, + .isVarLen = 1, + .startFn = tCompBinaryStart, + .cmprFn = tCompBinary, + .endFn = tCompBinaryEnd}, {.type = TSDB_DATA_TYPE_TIMESTAMP, .bytes = 8, .isVarLen = 0, - .initFn = tCompTimestampInit, - .cmprFn = tCompTimestamp}, - {.type = TSDB_DATA_TYPE_NCHAR, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, - {.type = TSDB_DATA_TYPE_UTINYINT, .bytes = 1, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, - {.type = TSDB_DATA_TYPE_USMALLINT, .bytes = 2, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, - {.type = TSDB_DATA_TYPE_UINT, .bytes = 4, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, - {.type = TSDB_DATA_TYPE_UBIGINT, .bytes = 8, .isVarLen = 0, .initFn = tCompIntInit, .cmprFn = tCompInt}, - {.type = TSDB_DATA_TYPE_JSON, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, - {.type = TSDB_DATA_TYPE_VARBINARY, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, - {.type = TSDB_DATA_TYPE_DECIMAL, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, - {.type = TSDB_DATA_TYPE_BLOB, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, - {.type = TSDB_DATA_TYPE_MEDIUMBLOB, .bytes = 1, .isVarLen = 1, .initFn = tCompBinaryInit, .cmprFn = tCompBinary}, + .startFn = tCompTimestampStart, + .cmprFn = tCompTimestamp, + .endFn = tCompTimestampEnd}, + {.type = TSDB_DATA_TYPE_NCHAR, + .bytes = 1, + .isVarLen = 1, + .startFn = tCompBinaryStart, + .cmprFn = tCompBinary, + .endFn = tCompBinaryEnd}, + {.type = TSDB_DATA_TYPE_UTINYINT, + .bytes = 1, + .isVarLen = 0, + .startFn = tCompIntStart, + .cmprFn = tCompInt, + .endFn = tCompIntEnd}, + {.type = TSDB_DATA_TYPE_USMALLINT, + .bytes = 2, + .isVarLen = 0, + .startFn = tCompIntStart, + .cmprFn = tCompInt, + .endFn = tCompIntEnd}, + {.type = TSDB_DATA_TYPE_UINT, + .bytes = 4, + .isVarLen = 0, + .startFn = tCompIntStart, + .cmprFn = tCompInt, + .endFn = tCompIntEnd}, + {.type = TSDB_DATA_TYPE_UBIGINT, + .bytes = 8, + .isVarLen = 0, + .startFn = tCompIntStart, + .cmprFn = tCompInt, + .endFn = tCompIntEnd}, + {.type = TSDB_DATA_TYPE_JSON, + .bytes = 1, + .isVarLen = 1, + .startFn = tCompBinaryStart, + .cmprFn = tCompBinary, + .endFn = tCompBinaryEnd}, + {.type = TSDB_DATA_TYPE_VARBINARY, + .bytes = 1, + .isVarLen = 1, + .startFn = tCompBinaryStart, + .cmprFn = tCompBinary, + .endFn = tCompBinaryEnd}, + {.type = TSDB_DATA_TYPE_DECIMAL, + .bytes = 1, + .isVarLen = 1, + .startFn = tCompBinaryStart, + .cmprFn = tCompBinary, + .endFn = tCompBinaryEnd}, + {.type = TSDB_DATA_TYPE_BLOB, + .bytes = 1, + .isVarLen = 1, + .startFn = tCompBinaryStart, + .cmprFn = tCompBinary, + .endFn = tCompBinaryEnd}, + {.type = TSDB_DATA_TYPE_MEDIUMBLOB, + .bytes = 1, + .isVarLen = 1, + .startFn = tCompBinaryStart, + .cmprFn = tCompBinary, + .endFn = tCompBinaryEnd}, }; struct SCompressor { @@ -1083,9 +1191,13 @@ struct SCompressor { }; // Timestamp ===================================================== -static int32_t tCompTimestampInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { +static int32_t tCompTimestampStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; - // TODO + pCmprsor->ts_prev_val = 0; + pCmprsor->ts_prev_delta = 0; + pCmprsor->ts_flag_p = NULL; + pCmprsor->aBuf[0][0] = 1; + pCmprsor->nBuf[0] = 1; return code; } @@ -1215,6 +1327,12 @@ static int32_t tCompTimestamp(SCompressor *pCmprsor, const void *pData, int32_t return code; } +static int32_t tCompTimestampEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { + int32_t code = 0; + // TODO + return code; +} + // Integer ===================================================== #define SIMPLE8B_MAX ((uint64_t)1152921504606846974LL) static const uint8_t BIT_PER_INTEGER[] = {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 15, 20, 30, 60}; @@ -1224,9 +1342,14 @@ static const uint8_t BIT_TO_SELECTOR[] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}; -static int32_t tCompIntInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { +static int32_t tCompIntStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; - // TODO + pCmprsor->i_prev = 0; + pCmprsor->i_selector = 0; + pCmprsor->i_start = 0; + pCmprsor->i_end = 0; + pCmprsor->aBuf[0][0] = 0; + pCmprsor->nBuf[0] = 1; return code; } @@ -1336,13 +1459,22 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) return code; } -// Float ===================================================== -static int32_t tCompFloatInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { +static int32_t tCompIntEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; // TODO return code; } +// Float ===================================================== +static int32_t tCompFloatStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { + int32_t code = 0; + pCmprsor->f_prev = 0; + pCmprsor->f_flag_p = NULL; + pCmprsor->aBuf[0][0] = 0; + pCmprsor->nBuf[0] = 1; + return code; +} + static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; @@ -1405,13 +1537,22 @@ static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nDat return code; } -// Double ===================================================== -static int32_t tCompDoubleInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { +static int32_t tCompFloatEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; // TODO return code; } +// Double ===================================================== +static int32_t tCompDoubleStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { + int32_t code = 0; + pCmprsor->d_prev = 0; + pCmprsor->d_flag_p = NULL; + pCmprsor->aBuf[0][0] = 0; + pCmprsor->nBuf[0] = 1; + return code; +} + static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; @@ -1474,13 +1615,19 @@ static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nDa return code; } -// Binary ===================================================== -static int32_t tCompBinaryInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { +static int32_t tCompDoubleEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; // TODO return code; } +// Binary ===================================================== +static int32_t tCompBinaryStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { + int32_t code = 0; + pCmprsor->nBuf[0] = 0; + return code; +} + static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; @@ -1498,12 +1645,18 @@ static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nDa return code; } +static int32_t tCompBinaryEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { + int32_t code = 0; + // TODO + return code; +} + // Bool ===================================================== static const uint8_t BOOL_CMPR_TABLE[] = {0b01, 0b0100, 0b010000, 0b01000000}; -static int32_t tCompBoolInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { +static int32_t tCompBoolStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; - // TODO + pCmprsor->nBuf[0] = 0; return code; } @@ -1531,6 +1684,12 @@ static int32_t tCompBool(SCompressor *pCmprsor, const void *pData, int32_t nData return code; } +static int32_t tCompBoolEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { + int32_t code = 0; + // TODO + return code; +} + // SCompressor ===================================================== int32_t tCompressorCreate(SCompressor **ppCmprsor) { int32_t code = 0; @@ -1565,7 +1724,7 @@ int32_t tCompressorDestroy(SCompressor *pCmprsor) { return code; } -int32_t tCompressorInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { +int32_t tCompressStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; pCmprsor->type = type; @@ -1573,82 +1732,21 @@ int32_t tCompressorInit(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { pCmprsor->autoAlloc = 1; pCmprsor->nVal = 0; - switch (type) { - case TSDB_DATA_TYPE_TIMESTAMP: - pCmprsor->ts_prev_val = 0; - pCmprsor->ts_prev_delta = 0; - pCmprsor->ts_flag_p = NULL; - pCmprsor->aBuf[0][0] = 1; // For timestamp, 1 means compressed, 0 otherwise - pCmprsor->nBuf[0] = 1; - break; - case TSDB_DATA_TYPE_BOOL: - pCmprsor->nBuf[0] = 0; - break; - case TSDB_DATA_TYPE_BINARY: - pCmprsor->nBuf[0] = 0; - break; - case TSDB_DATA_TYPE_FLOAT: - pCmprsor->f_prev = 0; - pCmprsor->f_flag_p = NULL; - pCmprsor->aBuf[0][0] = 0; // 0 means compressed, 1 otherwise (for backward compatibility) - pCmprsor->nBuf[0] = 1; - break; - case TSDB_DATA_TYPE_DOUBLE: - pCmprsor->d_prev = 0; - pCmprsor->d_flag_p = NULL; - pCmprsor->aBuf[0][0] = 0; // 0 means compressed, 1 otherwise (for backward compatibility) - pCmprsor->nBuf[0] = 1; - break; - case TSDB_DATA_TYPE_TINYINT: - case TSDB_DATA_TYPE_SMALLINT: - case TSDB_DATA_TYPE_INT: - case TSDB_DATA_TYPE_BIGINT: - case TSDB_DATA_TYPE_UTINYINT: - case TSDB_DATA_TYPE_USMALLINT: - case TSDB_DATA_TYPE_UINT: - case TSDB_DATA_TYPE_UBIGINT: - pCmprsor->i_prev = 0; - pCmprsor->i_selector = 0; - pCmprsor->i_start = 0; - pCmprsor->i_end = 0; - pCmprsor->aBuf[0][0] = 0; // 0 means compressed, 1 otherwise (for backward compatibility) - pCmprsor->nBuf[0] = 1; - break; - default: - break; + if (DATA_TYPE_INFO[type].startFn) { + DATA_TYPE_INFO[type].startFn(pCmprsor, type, cmprAlg); } return code; } -int32_t tCompGen(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { +int32_t tCompressEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; - if (pCmprsor->nVal == 0) { - *ppData = NULL; - *nData = 0; - return code; - } + *ppData = NULL; + *nData = 0; - if (pCmprsor->cmprAlg == TWO_STAGE_COMP /*|| IS_VAR_DATA_TYPE(pCmprsor->type)*/) { - code = tRealloc(&pCmprsor->aBuf[1], pCmprsor->nBuf[0] + 1); - if (code) return code; - - int64_t ret = LZ4_compress_default(pCmprsor->aBuf[0], pCmprsor->aBuf[1] + 1, pCmprsor->nBuf[0], pCmprsor->nBuf[0]); - if (ret) { - pCmprsor->aBuf[1][0] = 0; - pCmprsor->nBuf[1] = ret + 1; - } else { - pCmprsor->aBuf[1][0] = 1; - memcpy(pCmprsor->aBuf[1] + 1, pCmprsor->aBuf[0], pCmprsor->nBuf[0]); - pCmprsor->nBuf[1] = pCmprsor->nBuf[0] + 1; - } - - *ppData = pCmprsor->aBuf[1]; - *nData = pCmprsor->nBuf[1]; - } else { - *ppData = pCmprsor->aBuf[0]; - *nData = pCmprsor->nBuf[0]; + if (DATA_TYPE_INFO[pCmprsor->type].endFn) { + return DATA_TYPE_INFO[pCmprsor->type].endFn(pCmprsor, ppData, nData); } return code; From a34cf50a83c39bfde85e0dee60ae9c543cc68f5d Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 26 Sep 2022 13:43:23 +0800 Subject: [PATCH 028/143] refact more code --- source/common/src/tdataformat.c | 609 +++++++++++++++++++------------- 1 file changed, 359 insertions(+), 250 deletions(-) diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index a5e8d4be66..e461e06158 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -1135,288 +1135,397 @@ static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, SColVal *pColVa _exit: return code; } -static FORCE_INLINE int32_t tColDataAppendValue0(SColData *pColData, SColVal *pColVal) { // 0 +static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, SColVal *pColVal) { int32_t code = 0; - - if (COL_VAL_IS_NONE(pColVal)) { - pColData->flag = HAS_NONE; - } else if (COL_VAL_IS_NULL(pColVal)) { - pColData->flag = HAS_NULL; - } else { - pColData->flag = HAS_VALUE; - code = tColDataPutValue(pColData, pColVal); - if (code) goto _exit; - } - pColData->nVal++; - -_exit: - return code; -} -static FORCE_INLINE int32_t tColDataAppendValue1(SColData *pColData, SColVal *pColVal) { // HAS_NONE - int32_t code = 0; - - if (!COL_VAL_IS_NONE(pColVal)) { - int32_t nBit = BIT1_SIZE(pColData->nVal + 1); - - code = tRealloc(&pColData->pBitMap, nBit); - if (code) goto _exit; - - memset(pColData->pBitMap, 0, nBit); - SET_BIT1(pColData->pBitMap, pColData->nVal, 1); - - if (COL_VAL_IS_NULL(pColVal)) { - pColData->flag |= HAS_NULL; - } else { - pColData->flag |= HAS_VALUE; - - if (pColData->nVal) { - if (IS_VAR_DATA_TYPE(pColData->type)) { - int32_t nOffset = sizeof(int32_t) * pColData->nVal; - code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset); - if (code) goto _exit; - memset(pColData->aOffset, 0, nOffset); - } else { - pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal; - code = tRealloc(&pColData->pData, pColData->nData); - if (code) goto _exit; - memset(pColData->pData, 0, pColData->nData); - } - } - - code = tColDataPutValue(pColData, pColVal); - if (code) goto _exit; - } - } - pColData->nVal++; - -_exit: - return code; -} -static FORCE_INLINE int32_t tColDataAppendValue2(SColData *pColData, SColVal *pColVal) { // HAS_NULL - int32_t code = 0; - - if (!COL_VAL_IS_NULL(pColVal)) { - int32_t nBit = BIT1_SIZE(pColData->nVal + 1); - code = tRealloc(&pColData->pBitMap, nBit); - if (code) goto _exit; - - if (COL_VAL_IS_NONE(pColVal)) { - pColData->flag |= HAS_NONE; - - memset(pColData->pBitMap, 255, nBit); - SET_BIT1(pColData->pBitMap, pColData->nVal, 0); - } else { - pColData->flag |= HAS_VALUE; - - memset(pColData->pBitMap, 0, nBit); - SET_BIT1(pColData->pBitMap, pColData->nVal, 1); - - if (pColData->nVal) { - if (IS_VAR_DATA_TYPE(pColData->type)) { - int32_t nOffset = sizeof(int32_t) * pColData->nVal; - code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset); - if (code) goto _exit; - memset(pColData->aOffset, 0, nOffset); - } else { - pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal; - code = tRealloc(&pColData->pData, pColData->nData); - if (code) goto _exit; - memset(pColData->pData, 0, pColData->nData); - } - } - - code = tColDataPutValue(pColData, pColVal); - if (code) goto _exit; - } - } - pColData->nVal++; - -_exit: - return code; -} -static FORCE_INLINE int32_t tColDataAppendValue3(SColData *pColData, SColVal *pColVal) { // HAS_NULL|HAS_NONE - int32_t code = 0; - - if (COL_VAL_IS_NONE(pColVal)) { - code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); - if (code) goto _exit; - - SET_BIT1(pColData->pBitMap, pColData->nVal, 0); - } else if (COL_VAL_IS_NULL(pColVal)) { - code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); - if (code) goto _exit; - - SET_BIT1(pColData->pBitMap, pColData->nVal, 1); - } else { - pColData->flag |= HAS_VALUE; - - uint8_t *pBitMap = NULL; - code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1)); - if (code) goto _exit; - - for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { - SET_BIT2(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal)); - } - SET_BIT2(pBitMap, pColData->nVal, 2); - - tFree(pColData->pBitMap); - pColData->pBitMap = pBitMap; - - if (pColData->nVal) { - if (IS_VAR_DATA_TYPE(pColData->type)) { - int32_t nOffset = sizeof(int32_t) * pColData->nVal; - code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset); - if (code) goto _exit; - memset(pColData->aOffset, 0, nOffset); - } else { - pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal; - code = tRealloc(&pColData->pData, pColData->nData); - if (code) goto _exit; - memset(pColData->pData, 0, pColData->nData); - } - } - - code = tColDataPutValue(pColData, pColVal); - if (code) goto _exit; - } - pColData->nVal++; - -_exit: - return code; -} -static FORCE_INLINE int32_t tColDataAppendValue4(SColData *pColData, SColVal *pColVal) { // HAS_VALUE - int32_t code = 0; - - if (!COL_VAL_IS_VALUE(pColVal)) { - if (COL_VAL_IS_NONE(pColVal)) { - pColData->flag |= HAS_NONE; - } else { - pColData->flag |= HAS_NULL; - } - - int32_t nBit = BIT1_SIZE(pColData->nVal + 1); - code = tRealloc(&pColData->pBitMap, nBit); - if (code) goto _exit; - - memset(pColData->pBitMap, 255, nBit); - SET_BIT1(pColData->pBitMap, pColData->nVal, 0); - - code = tColDataPutValue(pColData, pColVal); - if (code) goto _exit; - } else { - code = tColDataPutValue(pColData, pColVal); - if (code) goto _exit; - } - pColData->nVal++; - -_exit: - return code; -} -static FORCE_INLINE int32_t tColDataAppendValue5(SColData *pColData, SColVal *pColVal) { // HAS_VALUE|HAS_NONE - int32_t code = 0; - - if (COL_VAL_IS_NULL(pColVal)) { - pColData->flag |= HAS_NULL; - - uint8_t *pBitMap = NULL; - code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1)); - if (code) goto _exit; - - for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { - SET_BIT2(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0); - } - SET_BIT2(pBitMap, pColData->nVal, 1); - - tFree(pColData->pBitMap); - pColData->pBitMap = pBitMap; - } else { - code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); - if (code) goto _exit; - - if (COL_VAL_IS_NONE(pColVal)) { - SET_BIT1(pColData->pBitMap, pColData->nVal, 0); - } else { - SET_BIT1(pColData->pBitMap, pColData->nVal, 1); - } - } + pColData->flag = HAS_VALUE; code = tColDataPutValue(pColData, pColVal); - if (code) goto _exit; - + if (code) return code; pColData->nVal++; - -_exit: return code; } -static FORCE_INLINE int32_t tColDataAppendValue6(SColData *pColData, SColVal *pColVal) { // HAS_VALUE|HAS_NULL +static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + pColData->flag = HAS_NONE; + pColData->nVal++; + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + pColData->flag = HAS_NULL; + pColData->nVal++; + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, SColVal *pColVal) { int32_t code = 0; - if (COL_VAL_IS_NONE(pColVal)) { - pColData->flag |= HAS_NONE; + int32_t nBit = BIT1_SIZE(pColData->nVal + 1); + code = tRealloc(&pColData->pBitMap, nBit); + if (code) return code; - uint8_t *pBitMap = NULL; - code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1)); - if (code) goto _exit; + memset(pColData->pBitMap, 0, nBit); + SET_BIT1(pColData->pBitMap, pColData->nVal, 1); - for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { - SET_BIT2(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1); - } - SET_BIT2(pBitMap, pColData->nVal, 0); + pColData->flag |= HAS_VALUE; - tFree(pColData->pBitMap); - pColData->pBitMap = pBitMap; - } else { - code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); - if (code) goto _exit; - - if (COL_VAL_IS_NULL(pColVal)) { - SET_BIT1(pColData->pBitMap, pColData->nVal, 0); + if (pColData->nVal) { + if (IS_VAR_DATA_TYPE(pColData->type)) { + int32_t nOffset = sizeof(int32_t) * pColData->nVal; + code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset); + if (code) return code; + memset(pColData->aOffset, 0, nOffset); } else { - SET_BIT1(pColData->pBitMap, pColData->nVal, 1); + pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal; + code = tRealloc(&pColData->pData, pColData->nData); + if (code) return code; + memset(pColData->pData, 0, pColData->nData); } } + code = tColDataPutValue(pColData, pColVal); - if (code) goto _exit; + if (code) return code; + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue11(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + pColData->nVal++; + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue12(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + int32_t nBit = BIT1_SIZE(pColData->nVal + 1); + code = tRealloc(&pColData->pBitMap, nBit); + if (code) return code; + + memset(pColData->pBitMap, 0, nBit); + SET_BIT1(pColData->pBitMap, pColData->nVal, 1); + + pColData->flag |= HAS_NULL; + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue20(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + int32_t nBit = BIT1_SIZE(pColData->nVal + 1); + code = tRealloc(&pColData->pBitMap, nBit); + if (code) return code; + + memset(pColData->pBitMap, 0, nBit); + SET_BIT1(pColData->pBitMap, pColData->nVal, 1); + + pColData->flag |= HAS_VALUE; + + if (pColData->nVal) { + if (IS_VAR_DATA_TYPE(pColData->type)) { + int32_t nOffset = sizeof(int32_t) * pColData->nVal; + code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset); + if (code) return code; + memset(pColData->aOffset, 0, nOffset); + } else { + pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal; + code = tRealloc(&pColData->pData, pColData->nData); + if (code) return code; + memset(pColData->pData, 0, pColData->nData); + } + } + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + int32_t nBit = BIT1_SIZE(pColData->nVal + 1); + code = tRealloc(&pColData->pBitMap, nBit); + if (code) return code; + + memset(pColData->pBitMap, 255, nBit); + SET_BIT1(pColData->pBitMap, pColData->nVal, 0); + + pColData->flag |= HAS_NONE; + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue22(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + pColData->nVal++; + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + pColData->flag |= HAS_VALUE; + + uint8_t *pBitMap = NULL; + code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1)); + if (code) return code; + + for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal)); + } + SET_BIT2(pBitMap, pColData->nVal, 2); + + tFree(pColData->pBitMap); + pColData->pBitMap = pBitMap; + + if (pColData->nVal) { + if (IS_VAR_DATA_TYPE(pColData->type)) { + int32_t nOffset = sizeof(int32_t) * pColData->nVal; + code = tRealloc((uint8_t **)(&pColData->aOffset), nOffset); + if (code) return code; + memset(pColData->aOffset, 0, nOffset); + } else { + pColData->nData = tDataTypes[pColData->type].bytes * pColData->nVal; + code = tRealloc(&pColData->pData, pColData->nData); + if (code) return code; + memset(pColData->pData, 0, pColData->nData); + } + } + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue31(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); + if (code) return code; + + SET_BIT1(pColData->pBitMap, pColData->nVal, 0); + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue32(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); + if (code) return code; + + SET_BIT1(pColData->pBitMap, pColData->nVal, 1); + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue40(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + pColData->flag |= HAS_NONE; + + int32_t nBit = BIT1_SIZE(pColData->nVal + 1); + code = tRealloc(&pColData->pBitMap, nBit); + if (code) return code; + + memset(pColData->pBitMap, 255, nBit); + SET_BIT1(pColData->pBitMap, pColData->nVal, 0); + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; pColData->nVal++; -_exit: return code; } -static FORCE_INLINE int32_t tColDataAppendValue7(SColData *pColData, - SColVal *pColVal) { // HAS_VALUE|HAS_NULL|HAS_NONE +static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + pColData->flag |= HAS_NULL; + + int32_t nBit = BIT1_SIZE(pColData->nVal + 1); + code = tRealloc(&pColData->pBitMap, nBit); + if (code) return code; + + memset(pColData->pBitMap, 255, nBit); + SET_BIT1(pColData->pBitMap, pColData->nVal, 0); + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); + if (code) return code; + + SET_BIT1(pColData->pBitMap, pColData->nVal, 1); + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); + if (code) return code; + + SET_BIT1(pColData->pBitMap, pColData->nVal, 0); + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + pColData->flag |= HAS_NULL; + + uint8_t *pBitMap = NULL; + code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1)); + if (code) return code; + + for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 0); + } + SET_BIT2(pBitMap, pColData->nVal, 1); + + tFree(pColData->pBitMap); + pColData->pBitMap = pBitMap; + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); + if (code) return code; + SET_BIT1(pColData->pBitMap, pColData->nVal, 1); + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + pColData->flag |= HAS_NONE; + + uint8_t *pBitMap = NULL; + code = tRealloc(&pBitMap, BIT2_SIZE(pColData->nVal + 1)); + if (code) return code; + + for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pColData->pBitMap, iVal) ? 2 : 1); + } + SET_BIT2(pBitMap, pColData->nVal, 0); + + tFree(pColData->pBitMap); + pColData->pBitMap = pBitMap; + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pColData->pBitMap, BIT1_SIZE(pColData->nVal + 1)); + if (code) return code; + SET_BIT1(pColData->pBitMap, pColData->nVal, 0); + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, SColVal *pColVal) { int32_t code = 0; code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1)); - if (code) goto _exit; + if (code) return code; + SET_BIT2(pColData->pBitMap, pColData->nVal, 2); - if (COL_VAL_IS_NONE(pColVal)) { - SET_BIT2(pColData->pBitMap, pColData->nVal, 0); - } else if (COL_VAL_IS_NULL(pColVal)) { - SET_BIT2(pColData->pBitMap, pColData->nVal, 1); - } else { - SET_BIT2(pColData->pBitMap, pColData->nVal, 2); - } code = tColDataPutValue(pColData, pColVal); - if (code) goto _exit; + if (code) return code; pColData->nVal++; -_exit: return code; } -static int32_t (*tColDataAppendValueImpl[])(SColData *pColData, SColVal *pColVal) = { - tColDataAppendValue0, // 0 - tColDataAppendValue1, // HAS_NONE - tColDataAppendValue2, // HAS_NULL - tColDataAppendValue3, // HAS_NULL|HAS_NONE - tColDataAppendValue4, // HAS_VALUE - tColDataAppendValue5, // HAS_VALUE|HAS_NONE - tColDataAppendValue6, // HAS_VALUE|HAS_NULL - tColDataAppendValue7 // HAS_VALUE|HAS_NULL|HAS_NONE +static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1)); + if (code) return code; + SET_BIT2(pColData->pBitMap, pColData->nVal, 0); + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + + pColData->nVal++; + + return code; +} +static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pColData->pBitMap, BIT2_SIZE(pColData->nVal + 1)); + if (code) return code; + SET_BIT2(pColData->pBitMap, pColData->nVal, 1); + + code = tColDataPutValue(pColData, pColVal); + if (code) return code; + + pColData->nVal++; + + return code; +} +static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, SColVal *pColVal) = { + {tColDataAppendValue00, tColDataAppendValue01, tColDataAppendValue02}, // 0 + {tColDataAppendValue10, tColDataAppendValue11, tColDataAppendValue12}, // HAS_NONE + {tColDataAppendValue20, tColDataAppendValue21, tColDataAppendValue22}, // HAS_NULL + {tColDataAppendValue30, tColDataAppendValue31, tColDataAppendValue32}, // HAS_NULL|HAS_NONE + {tColDataAppendValue40, tColDataAppendValue41, tColDataAppendValue42}, // HAS_VALUE + {tColDataAppendValue50, tColDataAppendValue51, tColDataAppendValue52}, // HAS_VALUE|HAS_NONE + {tColDataAppendValue60, tColDataAppendValue61, tColDataAppendValue62}, // HAS_VALUE|HAS_NULL + {tColDataAppendValue70, tColDataAppendValue71, tColDataAppendValue72}, // HAS_VALUE|HAS_NULL|HAS_NONE }; int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal) { ASSERT(pColData->cid == pColVal->cid && pColData->type == pColVal->type); - return tColDataAppendValueImpl[pColData->flag](pColData, pColVal); + return tColDataAppendValueImpl[pColData->flag][pColVal->flag](pColData, pColVal); } static FORCE_INLINE void tColDataGetValue1(SColData *pColData, int32_t iVal, SColVal *pColVal) { // HAS_NONE From 30937189aa9ec7d854a54058a93a8f0c87ed6d02 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 26 Sep 2022 14:10:58 +0800 Subject: [PATCH 029/143] refact more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 416 +++++++++++---------- 1 file changed, 221 insertions(+), 195 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 9e7e4cefe0..11f5c398ba 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -138,7 +138,7 @@ static FORCE_INLINE void tDiskColUpdateSma(SDiskColBuilder *pBuilder, SColVal *p } } -static int32_t tDiskColPutValue(SDiskColBuilder *pBuilder, SColVal *pColVal) { +static FORCE_INLINE int32_t tDiskColPutValue(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; if (IS_VAR_DATA_TYPE(pColVal->type)) { @@ -155,256 +155,282 @@ static int32_t tDiskColPutValue(SDiskColBuilder *pBuilder, SColVal *pColVal) { return code; } -static int32_t tDiskColAddVal0(SDiskColBuilder *pBuilder, SColVal *pColVal) { // 0 +static FORCE_INLINE int32_t tDiskColAddVal00(SDiskColBuilder *pBuilder, SColVal *pColVal) { + pBuilder->flag = HAS_VALUE; + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal01(SDiskColBuilder *pBuilder, SColVal *pColVal) { + pBuilder->flag = HAS_NONE; + return 0; +} +static FORCE_INLINE int32_t tDiskColAddVal02(SDiskColBuilder *pBuilder, SColVal *pColVal) { + pBuilder->flag = HAS_NULL; + return 0; +} +static FORCE_INLINE int32_t tDiskColAddVal10(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; - if (COL_VAL_IS_NONE(pColVal)) { - pBuilder->flag = HAS_NONE; - } else if (COL_VAL_IS_NULL(pColVal)) { - pBuilder->flag = HAS_NULL; - } else { - pBuilder->flag = HAS_VALUE; - code = tDiskColPutValue(pBuilder, pColVal); + // bit map + int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); + code = tRealloc(&pBuilder->pBitMap, nBit); + if (code) return code; + + memset(pBuilder->pBitMap, 0, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); + + // value + pBuilder->flag |= HAS_VALUE; + + SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + code = tDiskColPutValue(pBuilder, &cv); if (code) return code; } - return code; + return tDiskColPutValue(pBuilder, pColVal); } -static int32_t tDiskColAddVal1(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NONE +static FORCE_INLINE int32_t tDiskColAddVal12(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; - if (!COL_VAL_IS_NONE(pColVal)) { - // bit map - int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); + int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); + code = tRealloc(&pBuilder->pBitMap, nBit); + if (code) return code; - code = tRealloc(&pBuilder->pBitMap, nBit); + memset(pBuilder->pBitMap, 0, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); + + pBuilder->flag |= HAS_NULL; + + return code; +} +static FORCE_INLINE int32_t tDiskColAddVal20(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); + code = tRealloc(&pBuilder->pBitMap, nBit); + if (code) return code; + + pBuilder->flag |= HAS_VALUE; + + memset(pBuilder->pBitMap, 0, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); + + SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + code = tDiskColPutValue(pBuilder, &cv); if (code) return code; - - memset(pBuilder->pBitMap, 0, nBit); - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); - - // value - if (COL_VAL_IS_NULL(pColVal)) { - pBuilder->flag |= HAS_NULL; - } else { - pBuilder->flag |= HAS_VALUE; - - SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); - for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { - code = tDiskColPutValue(pBuilder, &cv); - if (code) return code; - } - - code = tDiskColPutValue(pBuilder, pColVal); - if (code) return code; - } } - return code; + return tDiskColPutValue(pBuilder, pColVal); } -static int32_t tDiskColAddVal2(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NULL +static FORCE_INLINE int32_t tDiskColAddVal21(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; - if (!COL_VAL_IS_NULL(pColVal)) { - int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); - code = tRealloc(&pBuilder->pBitMap, nBit); - if (code) goto _exit; + int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); + code = tRealloc(&pBuilder->pBitMap, nBit); + if (code) return code; - if (COL_VAL_IS_NONE(pColVal)) { - pBuilder->flag |= HAS_NONE; + pBuilder->flag |= HAS_NONE; - memset(pBuilder->pBitMap, 255, nBit); - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - } else { - pBuilder->flag |= HAS_VALUE; + memset(pBuilder->pBitMap, 255, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - memset(pBuilder->pBitMap, 0, nBit); - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); - - SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); - for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { - code = tDiskColPutValue(pBuilder, &cv); - if (code) goto _exit; - } - - code = tDiskColPutValue(pBuilder, pColVal); - if (code) goto _exit; - } - } - -_exit: return code; } -static int32_t tDiskColAddVal3(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_NULL|HAS_NONE +static FORCE_INLINE int32_t tDiskColAddVal30(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; - if (COL_VAL_IS_NONE(pColVal)) { - code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); - if (code) goto _exit; + pBuilder->flag |= HAS_VALUE; - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - } else if (COL_VAL_IS_NULL(pColVal)) { - code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); - if (code) goto _exit; + uint8_t *pBitMap = NULL; + code = tRealloc(&pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); + if (code) return code; - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); - } else { - pBuilder->flag |= HAS_VALUE; + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pBuilder->pBitMap, iVal)); + } + SET_BIT2(pBitMap, pBuilder->nVal, 2); - uint8_t *pBitMap = NULL; - code = tRealloc(&pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); - if (code) goto _exit; + tFree(pBuilder->pBitMap); + pBuilder->pBitMap = pBitMap; - for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { - SET_BIT2(pBitMap, iVal, GET_BIT1(pBuilder->pBitMap, iVal)); - } - SET_BIT2(pBitMap, pBuilder->nVal, 2); - - tFree(pBuilder->pBitMap); - pBuilder->pBitMap = pBitMap; - - SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); - for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { - code = tDiskColPutValue(pBuilder, &cv); - if (code) goto _exit; - } - - code = tDiskColPutValue(pBuilder, pColVal); - if (code) goto _exit; + SColVal cv = COL_VAL_VALUE(pColVal->cid, pColVal->type, (SValue){0}); + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + code = tDiskColPutValue(pBuilder, &cv); + if (code) return code; } -_exit: - return code; + return tDiskColPutValue(pBuilder, pColVal); } -static int32_t tDiskColAddVal4(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE +static FORCE_INLINE int32_t tDiskColAddVal31(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; - if (!COL_VAL_IS_VALUE(pColVal)) { - if (COL_VAL_IS_NONE(pColVal)) { - pBuilder->flag |= HAS_NONE; - } else { - pBuilder->flag |= HAS_NULL; - } + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); + if (code) return code; + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); - code = tRealloc(&pBuilder->pBitMap, nBit); - if (code) goto _exit; - - memset(pBuilder->pBitMap, 255, nBit); - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - - code = tDiskColPutValue(pBuilder, pColVal); - if (code) goto _exit; - } else { - code = tDiskColPutValue(pBuilder, pColVal); - if (code) goto _exit; - } - -_exit: return code; } -static int32_t tDiskColAddVal5(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE|HAS_NONE +static FORCE_INLINE int32_t tDiskColAddVal32(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; - if (COL_VAL_IS_NULL(pColVal)) { - pBuilder->flag |= HAS_NULL; + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); + if (code) return code; + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); - uint8_t *pBitMap = NULL; - code = tRealloc(&pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); - if (code) goto _exit; - - for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { - SET_BIT2(pBitMap, iVal, GET_BIT1(pBuilder->pBitMap, iVal) ? 2 : 0); - } - SET_BIT2(pBitMap, pBuilder->nVal, 1); - - tFree(pBuilder->pBitMap); - pBuilder->pBitMap = pBitMap; - } else { - code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); - if (code) goto _exit; - - if (COL_VAL_IS_NONE(pColVal)) { - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - } else { - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); - } - } - code = tDiskColPutValue(pBuilder, pColVal); - if (code) goto _exit; - -_exit: return code; } -static int32_t tDiskColAddVal6(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE|HAS_NULL +static FORCE_INLINE int32_t tDiskColAddVal40(SDiskColBuilder *pBuilder, SColVal *pColVal) { + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal41(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; - if (COL_VAL_IS_NONE(pColVal)) { - pBuilder->flag |= HAS_NONE; + pBuilder->flag |= HAS_NONE; - uint8_t *pBitMap = NULL; - code = tRealloc(&pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); - if (code) goto _exit; + int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); + code = tRealloc(&pBuilder->pBitMap, nBit); + if (code) return code; - for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { - SET_BIT2(pBitMap, iVal, GET_BIT1(pBuilder->pBitMap, iVal) ? 2 : 1); - } - SET_BIT2(pBitMap, pBuilder->nVal, 0); + memset(pBuilder->pBitMap, 255, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - tFree(pBuilder->pBitMap); - pBuilder->pBitMap = pBitMap; - } else { - code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); - if (code) goto _exit; - - if (COL_VAL_IS_NULL(pColVal)) { - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); - } else { - SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); - } - } - code = tDiskColPutValue(pBuilder, pColVal); - if (code) goto _exit; - -_exit: - return code; + return tDiskColPutValue(pBuilder, pColVal); } -static int32_t tDiskColAddVal7(SDiskColBuilder *pBuilder, SColVal *pColVal) { // HAS_VALUE|HAS_NULL|HAS_NONE +static FORCE_INLINE int32_t tDiskColAddVal42(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + pBuilder->flag |= HAS_NULL; + + int32_t nBit = BIT1_SIZE(pBuilder->nVal + 1); + code = tRealloc(&pBuilder->pBitMap, nBit); + if (code) return code; + + memset(pBuilder->pBitMap, 255, nBit); + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); + + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal50(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); + if (code) return code; + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); + + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal51(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); + if (code) return code; + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); + + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal52(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + pBuilder->flag |= HAS_NULL; + + uint8_t *pBitMap = NULL; + code = tRealloc(&pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); + if (code) return code; + + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pBuilder->pBitMap, iVal) ? 2 : 0); + } + SET_BIT2(pBitMap, pBuilder->nVal, 1); + + tFree(pBuilder->pBitMap); + pBuilder->pBitMap = pBitMap; + + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal60(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); + if (code) return code; + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 1); + + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal61(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + pBuilder->flag |= HAS_NONE; + + uint8_t *pBitMap = NULL; + code = tRealloc(&pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); + if (code) return code; + + for (int32_t iVal = 0; iVal < pBuilder->nVal; iVal++) { + SET_BIT2(pBitMap, iVal, GET_BIT1(pBuilder->pBitMap, iVal) ? 2 : 1); + } + SET_BIT2(pBitMap, pBuilder->nVal, 0); + + tFree(pBuilder->pBitMap); + pBuilder->pBitMap = pBitMap; + + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal62(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pBuilder->pBitMap, BIT1_SIZE(pBuilder->nVal + 1)); + if (code) return code; + SET_BIT1(pBuilder->pBitMap, pBuilder->nVal, 0); + + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal70(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; code = tRealloc(&pBuilder->pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); - if (code) goto _exit; + if (code) return code; + SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 2); - if (COL_VAL_IS_NONE(pColVal)) { - SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 0); - } else if (COL_VAL_IS_NULL(pColVal)) { - SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 1); - } else { - SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 2); - } - code = tDiskColPutValue(pBuilder, pColVal); - if (code) goto _exit; - -_exit: - return code; + return tDiskColPutValue(pBuilder, pColVal); } -static int32_t (*tDiskColAddValImpl[])(SDiskColBuilder *pBuilder, SColVal *pColVal) = { - tDiskColAddVal0, // 0 - tDiskColAddVal1, // HAS_NONE - tDiskColAddVal2, // HAS_NULL - tDiskColAddVal3, // HAS_NULL|HAS_NONE - tDiskColAddVal4, // HAS_VALUE - tDiskColAddVal5, // HAS_VALUE|HAS_NONE - tDiskColAddVal6, // HAS_VALUE|HAS_NULL - tDiskColAddVal7, // HAS_VALUE|HAS_NULL|HAS_NONE +static FORCE_INLINE int32_t tDiskColAddVal71(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pBuilder->pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); + if (code) return code; + SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 0); + + return tDiskColPutValue(pBuilder, pColVal); +} +static FORCE_INLINE int32_t tDiskColAddVal72(SDiskColBuilder *pBuilder, SColVal *pColVal) { + int32_t code = 0; + + code = tRealloc(&pBuilder->pBitMap, BIT2_SIZE(pBuilder->nVal + 1)); + if (code) return code; + SET_BIT2(pBuilder->pBitMap, pBuilder->nVal, 1); + + return tDiskColPutValue(pBuilder, pColVal); +} +static int32_t (*tDiskColAddValImpl[8][3])(SDiskColBuilder *pBuilder, SColVal *pColVal) = { + {tDiskColAddVal00, tDiskColAddVal01, tDiskColAddVal02}, // 0 + {tDiskColAddVal10, NULL, tDiskColAddVal12}, // HAS_NONE + {tDiskColAddVal20, tDiskColAddVal21, NULL}, // HAS_NULL + {tDiskColAddVal30, tDiskColAddVal31, tDiskColAddVal32}, // HAS_NULL|HAS_NONE + {tDiskColAddVal40, tDiskColAddVal41, tDiskColAddVal42}, // HAS_VALUE + {tDiskColAddVal50, tDiskColAddVal51, tDiskColAddVal52}, // HAS_VALUE|HAS_NONE + {tDiskColAddVal60, tDiskColAddVal61, tDiskColAddVal62}, // HAS_VALUE|HAS_NULL + {tDiskColAddVal70, tDiskColAddVal71, tDiskColAddVal72} // HAS_VALUE|HAS_NULL|HAS_NONE }; static int32_t tDiskColAddVal(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; if (pBuilder->calcSma) tDiskColUpdateSma(pBuilder, pColVal); - code = tDiskColAddValImpl[pBuilder->type](pBuilder, pColVal); - if (code) return code; + if (tDiskColAddValImpl[pBuilder->type][pColVal->type]) { + code = tDiskColAddValImpl[pBuilder->type][pColVal->type](pBuilder, pColVal); + if (code) return code; + } pBuilder->nVal++; From 08feade5fe3a9da96268008b9ef9a98a4e857d04 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 26 Sep 2022 14:24:35 +0800 Subject: [PATCH 030/143] more code --- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 18 ++++++++---------- source/dnode/vnode/src/tsdb/tsdbUtil.c | 6 +++--- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 11f5c398ba..bbf4e3337c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -129,15 +129,6 @@ static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { return code; } -extern void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet); -static FORCE_INLINE void tDiskColUpdateSma(SDiskColBuilder *pBuilder, SColVal *pColVal) { - if (!COL_VAL_IS_VALUE(pColVal)) { - pBuilder->sma.numOfNull++; - } else { - tSmaUpdateImpl[pBuilder->type](&pBuilder->sma, pColVal, &pBuilder->minSet, &pBuilder->maxSet); - } -} - static FORCE_INLINE int32_t tDiskColPutValue(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; @@ -422,10 +413,17 @@ static int32_t (*tDiskColAddValImpl[8][3])(SDiskColBuilder *pBuilder, SColVal *p {tDiskColAddVal60, tDiskColAddVal61, tDiskColAddVal62}, // HAS_VALUE|HAS_NULL {tDiskColAddVal70, tDiskColAddVal71, tDiskColAddVal72} // HAS_VALUE|HAS_NULL|HAS_NONE }; +extern void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet); static int32_t tDiskColAddVal(SDiskColBuilder *pBuilder, SColVal *pColVal) { int32_t code = 0; - if (pBuilder->calcSma) tDiskColUpdateSma(pBuilder, pColVal); + if (pBuilder->calcSma) { + if (COL_VAL_IS_VALUE(pColVal)) { + tSmaUpdateImpl[pBuilder->type](&pBuilder->sma, pColVal, &pBuilder->minSet, &pBuilder->maxSet); + } else { + pBuilder->sma.numOfNull++; + } + } if (tDiskColAddValImpl[pBuilder->type][pColVal->type]) { code = tDiskColAddValImpl[pBuilder->type][pColVal->type](pBuilder, pColVal); diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 1d7eff9a08..cae113dc4b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -1589,10 +1589,10 @@ void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) { for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) { tColDataGetValue(pColData, iVal, &cv); - if (!COL_VAL_IS_VALUE(&cv)) { - pColAgg->numOfNull++; - } else { + if (COL_VAL_IS_VALUE(&cv)) { tSmaUpdateImpl[pColData->type](pColAgg, &cv, &minSet, &maxSet); + } else { + pColAgg->numOfNull++; } } } From 787e166215551d657884a4e063f2fd30ee8e3361 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 26 Sep 2022 17:45:37 +0800 Subject: [PATCH 031/143] refact more code --- source/util/src/tcompression.c | 556 ++++++++++++++++++++++++--------- 1 file changed, 409 insertions(+), 147 deletions(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index f1d9b860b8..65e8cabe32 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1159,8 +1159,9 @@ struct SCompressor { int8_t cmprAlg; int8_t autoAlloc; int32_t nVal; - uint8_t *aBuf[2]; - int64_t nBuf[2]; + uint8_t *pBuf; + int32_t nBuf; + uint8_t *aBuf[1]; union { // Timestamp ---- struct { @@ -1193,93 +1194,91 @@ struct SCompressor { // Timestamp ===================================================== static int32_t tCompTimestampStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; - pCmprsor->ts_prev_val = 0; - pCmprsor->ts_prev_delta = 0; - pCmprsor->ts_flag_p = NULL; - pCmprsor->aBuf[0][0] = 1; - pCmprsor->nBuf[0] = 1; + + pCmprsor->nBuf = 1; + + code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf); + if (code) return code; + + pCmprsor->pBuf[0] = 1; + return code; } -static int32_t tCompSetCopyMode(SCompressor *pCmprsor) { +static int32_t tCompSwitchToCopyMode(SCompressor *pCmprsor) { int32_t code = 0; - if (pCmprsor->nVal) { - if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->aBuf[1], sizeof(int64_t) * pCmprsor->nVal); - if (code) return code; - } - pCmprsor->nBuf[1] = 0; + if (pCmprsor->nVal == 0) goto _exit; - int64_t n = 1; - int64_t value; - int64_t delta; - uint64_t vZigzag; - while (n < pCmprsor->nBuf[0]) { - uint8_t aN[2]; - aN[0] = pCmprsor->aBuf[0][n] & 0xf; - aN[1] = pCmprsor->aBuf[0][n] >> 4; - - n++; - - for (int32_t i = 0; i < 2; i++) { - vZigzag = 0; - for (uint8_t j = 0; j < aN[i]; j++) { - vZigzag |= (((uint64_t)pCmprsor->aBuf[0][n]) << (8 * j)); - n++; - } - - int64_t delta_of_delta = ZIGZAG_DECODE(int64_t, vZigzag); - if (pCmprsor->nBuf[1] == 0) { - delta = 0; - value = delta_of_delta; - } else { - delta = delta_of_delta + delta; - value = delta + value; - } - - memcpy(pCmprsor->aBuf[1] + pCmprsor->nBuf[1], &value, sizeof(int64_t)); - pCmprsor->nBuf[1] += sizeof(int64_t); - - if (n >= pCmprsor->nBuf[0]) break; - } - } - - ASSERT(n == pCmprsor->nBuf[0]); - - if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf[1] + 1); - if (code) return code; - } - memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->aBuf[1], pCmprsor->nBuf[1]); - pCmprsor->nBuf[0] = 1 + pCmprsor->nBuf[1]; + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], sizeof(int64_t) * pCmprsor->nVal + 1))) { + return code; } - pCmprsor->aBuf[0][0] = 0; + int32_t n = 1; + int32_t nBuf = 1; + int64_t value; + int64_t delta; + for (int32_t iVal = 0; iVal < pCmprsor->nVal;) { + uint8_t aN[2] = {(pCmprsor->pBuf[n] & 0xf), (pCmprsor->pBuf[n] >> 4)}; + + n++; + + for (int32_t i = 0; i < 2; i++) { + uint64_t vZigzag = 0; + for (uint8_t j = 0; j < aN[i]; j++) { + vZigzag |= (((uint64_t)pCmprsor->pBuf[n]) << (8 * j)); + n++; + } + + int64_t delta_of_delta = ZIGZAG_DECODE(int64_t, vZigzag); + if (iVal) { + delta = delta_of_delta + delta; + value = delta + value; + } else { + delta = 0; + value = delta_of_delta; + } + + memcpy(pCmprsor->aBuf[0] + nBuf, &value, sizeof(value)); + nBuf += sizeof(int64_t); + + iVal++; + if (iVal >= pCmprsor->nVal) break; + } + } + + ASSERT(n == pCmprsor->nBuf && nBuf == sizeof(int64_t) * pCmprsor->nBuf + 1); + + uint8_t *pBuf = pCmprsor->pBuf; + pCmprsor->pBuf = pCmprsor->aBuf[0]; + pCmprsor->aBuf[0] = pBuf; + pCmprsor->nBuf = nBuf; + +_exit: + pCmprsor->pBuf[0] = 0; return code; } static int32_t tCompTimestamp(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; int64_t ts = *(int64_t *)pData; - ASSERT(pCmprsor->type == TSDB_DATA_TYPE_TIMESTAMP); ASSERT(nData == 8); - if (pCmprsor->aBuf[0][0] == 1) { + if (pCmprsor->pBuf[0] == 1) { if (pCmprsor->nVal == 0) { pCmprsor->ts_prev_val = ts; pCmprsor->ts_prev_delta = -ts; } if (!I64_SAFE_ADD(ts, -pCmprsor->ts_prev_val)) { - code = tCompSetCopyMode(pCmprsor); + code = tCompSwitchToCopyMode(pCmprsor); if (code) return code; goto _copy_cmpr; } int64_t delta = ts - pCmprsor->ts_prev_val; if (!I64_SAFE_ADD(delta, -pCmprsor->ts_prev_delta)) { - code = tCompSetCopyMode(pCmprsor); + code = tCompSwitchToCopyMode(pCmprsor); if (code) return code; goto _copy_cmpr; } @@ -1290,37 +1289,35 @@ static int32_t tCompTimestamp(SCompressor *pCmprsor, const void *pData, int32_t pCmprsor->ts_prev_delta = delta; if ((pCmprsor->nVal & 0x1) == 0) { - if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf[0] + 17); - if (code) return code; + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + 17))) { + return code; } - pCmprsor->ts_flag_p = pCmprsor->aBuf[0] + pCmprsor->nBuf[0]; - pCmprsor->nBuf[0]++; + pCmprsor->ts_flag_p = pCmprsor->pBuf + pCmprsor->nBuf; + pCmprsor->nBuf++; pCmprsor->ts_flag_p[0] = 0; while (vZigzag) { - pCmprsor->aBuf[0][pCmprsor->nBuf[0]] = (vZigzag & 0xff); - pCmprsor->nBuf[0]++; + pCmprsor->pBuf[pCmprsor->nBuf] = (vZigzag & 0xff); + pCmprsor->nBuf++; pCmprsor->ts_flag_p[0]++; vZigzag >>= 8; } } else { while (vZigzag) { - pCmprsor->aBuf[0][pCmprsor->nBuf[0]] = (vZigzag & 0xff); - pCmprsor->nBuf[0]++; + pCmprsor->pBuf[pCmprsor->nBuf] = (vZigzag & 0xff); + pCmprsor->nBuf++; pCmprsor->ts_flag_p[0] += 0x10; vZigzag >>= 8; } } } else { _copy_cmpr: - if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf[0] + sizeof(ts)); - if (code) return code; + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + sizeof(ts)))) { + return code; } - memcpy(pCmprsor->aBuf[0] + pCmprsor->nBuf[0], &ts, sizeof(ts)); - pCmprsor->nBuf[0] += sizeof(ts); + memcpy(pCmprsor->pBuf + pCmprsor->nBuf, &ts, sizeof(ts)); + pCmprsor->nBuf += sizeof(ts); } pCmprsor->nVal++; @@ -1329,7 +1326,34 @@ static int32_t tCompTimestamp(SCompressor *pCmprsor, const void *pData, int32_t static int32_t tCompTimestampEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; - // TODO + + if (pCmprsor->nBuf >= sizeof(int64_t) * pCmprsor->nVal + 1 && pCmprsor->pBuf[0] == 1) { + code = tCompSwitchToCopyMode(pCmprsor); + if (code) return code; + } + + if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { + return code; + } + + *ppData = pCmprsor->aBuf[0]; + int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); + if (szComp && szComp < pCmprsor->nBuf) { + pCmprsor->aBuf[0][0] = 1; + *nData = szComp + 1; + } else { + pCmprsor->aBuf[0][0] = 0; + memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); + *nData = pCmprsor->nBuf + 1; + } + } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { + *ppData = pCmprsor->pBuf; + *nData = pCmprsor->nBuf; + } else { + ASSERT(0); + } + return code; } @@ -1344,12 +1368,24 @@ static const uint8_t BIT_TO_SELECTOR[] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10 static int32_t tCompIntStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; + pCmprsor->i_prev = 0; pCmprsor->i_selector = 0; pCmprsor->i_start = 0; pCmprsor->i_end = 0; - pCmprsor->aBuf[0][0] = 0; - pCmprsor->nBuf[0] = 1; + pCmprsor->nBuf = 1; + + code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf); + if (code) return code; + + pCmprsor->pBuf[0] = 0; + + return code; +} + +static int32_t tCompIntSwitchToCopy(SCompressor *pCmprsor) { + int32_t code = 0; + // ASSERT(0); return code; } @@ -1363,26 +1399,18 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) switch (pCmprsor->type) { case TSDB_DATA_TYPE_TINYINT: + case TSDB_DATA_TYPE_UTINYINT: val = *(int8_t *)pData; break; case TSDB_DATA_TYPE_SMALLINT: + case TSDB_DATA_TYPE_USMALLINT: val = *(int16_t *)pData; break; case TSDB_DATA_TYPE_INT: + case TSDB_DATA_TYPE_UINT: val = *(int32_t *)pData; break; case TSDB_DATA_TYPE_BIGINT: - val = *(int64_t *)pData; - break; - case TSDB_DATA_TYPE_UTINYINT: - val = *(uint8_t *)pData; - break; - case TSDB_DATA_TYPE_USMALLINT: - val = *(uint16_t *)pData; - break; - case TSDB_DATA_TYPE_UINT: - val = *(uint32_t *)pData; - break; case TSDB_DATA_TYPE_UBIGINT: val = *(int64_t *)pData; break; @@ -1392,14 +1420,16 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) } if (!I64_SAFE_ADD(val, -pCmprsor->i_prev)) { - // TODO + code = tCompIntSwitchToCopy(pCmprsor); + if (code) return code; goto _copy_cmpr; } int64_t diff = val - pCmprsor->i_prev; uint64_t vZigzag = ZIGZAG_ENCODE(int64_t, diff); if (vZigzag >= SIMPLE8B_MAX) { - // TODO + code = tCompIntSwitchToCopy(pCmprsor); + if (code) return code; goto _copy_cmpr; } @@ -1424,12 +1454,12 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) nEle = SELECTOR_TO_ELEMS[pCmprsor->i_selector]; if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf[0] + sizeof(uint64_t)); + code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + sizeof(uint64_t)); if (code) return code; } - uint64_t *bp = (uint64_t *)(pCmprsor->aBuf[0] + pCmprsor->nBuf[0]); - pCmprsor->nBuf[0] += sizeof(uint64_t); + uint64_t *bp = (uint64_t *)(pCmprsor->pBuf + pCmprsor->nBuf); + pCmprsor->nBuf += sizeof(uint64_t); bp[0] = pCmprsor->i_selector; uint8_t bits = BIT_PER_INTEGER[pCmprsor->i_selector]; for (int32_t iVal = 0; iVal < nEle; iVal++) { @@ -1448,11 +1478,11 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) } } else { _copy_cmpr: - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf[0] + nData); + code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + nData); if (code) return code; - memcpy(pCmprsor->aBuf[0] + pCmprsor->nBuf[0], pData, nData); - pCmprsor->nBuf[0] += nData; + memcpy(pCmprsor->pBuf + pCmprsor->nBuf, pData, nData); + pCmprsor->nBuf += nData; } pCmprsor->nVal++; @@ -1461,20 +1491,107 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) static int32_t tCompIntEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; - // TODO + + if (pCmprsor->nBuf >= DATA_TYPE_INFO[pCmprsor->type].bytes * pCmprsor->nVal + 1 && pCmprsor->pBuf[0] == 0) { + code = tCompIntSwitchToCopy(pCmprsor); + if (code) return code; + } + + if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { + return code; + } + + *ppData = pCmprsor->aBuf[0]; + int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); + if (szComp && szComp < pCmprsor->nBuf) { + pCmprsor->aBuf[0][0] = 1; + *nData = szComp + 1; + } else { + pCmprsor->aBuf[0][0] = 0; + memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); + *nData = pCmprsor->nBuf + 1; + } + } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { + *ppData = pCmprsor->pBuf; + *nData = pCmprsor->nBuf; + } else { + ASSERT(0); + } + return code; } // Float ===================================================== static int32_t tCompFloatStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; + pCmprsor->f_prev = 0; pCmprsor->f_flag_p = NULL; - pCmprsor->aBuf[0][0] = 0; - pCmprsor->nBuf[0] = 1; + + pCmprsor->nBuf = 1; + + code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf); + if (code) return code; + + pCmprsor->pBuf[0] = 0; + return code; } +static int32_t tCompFloatSwitchToCopy(SCompressor *pCmprsor) { + int32_t code = 0; + + if (pCmprsor->nVal == 0) goto _exit; + + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], sizeof(float) * pCmprsor->nVal + 1))) { + return code; + } + + int32_t n = 1; + int32_t nBuf = 1; + union { + float f; + uint32_t u; + } val = {.u = 0}; + + for (int32_t iVal = 0; iVal < pCmprsor->nVal;) { + uint8_t flags[2] = {(pCmprsor->pBuf[n] & 0xf), (pCmprsor->pBuf[n] >> 4)}; + + n++; + + for (int8_t i = 0; i < 2; i++) { + uint8_t flag = flags[i]; + + uint32_t diff = 0; + int8_t nBytes = (flag & 0x7) + 1; + for (int j = 0; j < nBytes; j++) { + diff |= (((uint32_t)pCmprsor->pBuf[n]) << (8 * j)); + n++; + } + + if (flag & 0x8) { + diff <<= (32 - nBytes * 8); + } + + val.u ^= diff; + + memcpy(pCmprsor->aBuf[0] + nBuf, &val.f, sizeof(val)); + nBuf += sizeof(val); + + iVal++; + if (iVal >= pCmprsor->nVal) break; + } + } + uint8_t *pBuf = pCmprsor->pBuf; + pCmprsor->pBuf = pCmprsor->aBuf[0]; + pCmprsor->aBuf[0] = pBuf; + pCmprsor->nBuf = nBuf; + +_exit: + pCmprsor->pBuf[0] = 1; + return code; +} static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; @@ -1507,13 +1624,12 @@ static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nDat if (nBytes == 0) nBytes++; if ((pCmprsor->nVal & 0x1) == 0) { - if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf[0] + 9); - if (code) return code; + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + 9))) { + return code; } - pCmprsor->f_flag_p = &pCmprsor->aBuf[0][pCmprsor->nBuf[0]]; - pCmprsor->nBuf[0]++; + pCmprsor->f_flag_p = &pCmprsor->pBuf[pCmprsor->nBuf]; + pCmprsor->nBuf++; if (clz < ctz) { pCmprsor->f_flag_p[0] = (0x08 | (nBytes - 1)); @@ -1528,8 +1644,8 @@ static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nDat } } for (; nBytes; nBytes--) { - pCmprsor->aBuf[0][pCmprsor->nBuf[0]] = (diff & 0xff); - pCmprsor->nBuf[0]++; + pCmprsor->pBuf[pCmprsor->nBuf] = (diff & 0xff); + pCmprsor->nBuf++; diff >>= BITS_PER_BYTE; } pCmprsor->nVal++; @@ -1539,20 +1655,107 @@ static int32_t tCompFloat(SCompressor *pCmprsor, const void *pData, int32_t nDat static int32_t tCompFloatEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; - // TODO + + if (pCmprsor->nBuf >= sizeof(float) * pCmprsor->nVal + 1) { + code = tCompFloatSwitchToCopy(pCmprsor); + if (code) return code; + } + + if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { + return code; + } + + *ppData = pCmprsor->aBuf[0]; + int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); + if (szComp && szComp < pCmprsor->nBuf) { + pCmprsor->aBuf[0][0] = 1; + *nData = szComp + 1; + } else { + pCmprsor->aBuf[0][0] = 0; + memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); + *nData = pCmprsor->nBuf + 1; + } + } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { + *ppData = pCmprsor->pBuf; + *nData = pCmprsor->nBuf; + } else { + ASSERT(0); + } + return code; } // Double ===================================================== static int32_t tCompDoubleStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; + pCmprsor->d_prev = 0; pCmprsor->d_flag_p = NULL; - pCmprsor->aBuf[0][0] = 0; - pCmprsor->nBuf[0] = 1; + + pCmprsor->nBuf = 1; + + code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf); + if (code) return code; + + pCmprsor->pBuf[0] = 0; + return code; } +static int32_t tCompDoubleSwitchToCopy(SCompressor *pCmprsor) { + int32_t code = 0; + + if (pCmprsor->nVal == 0) goto _exit; + + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], sizeof(double) * pCmprsor->nVal + 1))) { + return code; + } + + int32_t n = 1; + int32_t nBuf = 1; + union { + double f; + uint64_t u; + } val = {.u = 0}; + + for (int32_t iVal = 0; iVal < pCmprsor->nVal;) { + uint8_t flags[2] = {(pCmprsor->pBuf[n] & 0xf), (pCmprsor->pBuf[n] >> 4)}; + + n++; + + for (int8_t i = 0; i < 2; i++) { + uint8_t flag = flags[i]; + + uint64_t diff = 0; + int8_t nBytes = (flag & 0x7) + 1; + for (int j = 0; j < nBytes; j++) { + diff |= (((uint64_t)pCmprsor->pBuf[n]) << (8 * j)); + n++; + } + + if (flag & 0x8) { + diff <<= (64 - nBytes * 8); + } + + val.u ^= diff; + + memcpy(pCmprsor->aBuf[0] + nBuf, &val.f, sizeof(val)); + nBuf += sizeof(val); + + iVal++; + if (iVal >= pCmprsor->nVal) break; + } + } + uint8_t *pBuf = pCmprsor->pBuf; + pCmprsor->pBuf = pCmprsor->aBuf[0]; + pCmprsor->aBuf[0] = pBuf; + pCmprsor->nBuf = nBuf; + +_exit: + pCmprsor->pBuf[0] = 1; + return code; +} static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; @@ -1585,13 +1788,12 @@ static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nDa if (nBytes == 0) nBytes++; if ((pCmprsor->nVal & 0x1) == 0) { - if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf[0] + 17); - if (code) return code; + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + 17))) { + return code; } - pCmprsor->d_flag_p = &pCmprsor->aBuf[0][pCmprsor->nBuf[0]]; - pCmprsor->nBuf[0]++; + pCmprsor->d_flag_p = &pCmprsor->pBuf[pCmprsor->nBuf]; + pCmprsor->nBuf++; if (clz < ctz) { pCmprsor->d_flag_p[0] = (0x08 | (nBytes - 1)); @@ -1606,8 +1808,8 @@ static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nDa } } for (; nBytes; nBytes--) { - pCmprsor->aBuf[0][pCmprsor->nBuf[0]] = (diff & 0xff); - pCmprsor->nBuf[0]++; + pCmprsor->pBuf[pCmprsor->nBuf] = (diff & 0xff); + pCmprsor->nBuf++; diff >>= BITS_PER_BYTE; } pCmprsor->nVal++; @@ -1617,28 +1819,53 @@ static int32_t tCompDouble(SCompressor *pCmprsor, const void *pData, int32_t nDa static int32_t tCompDoubleEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; - // TODO + + if (pCmprsor->nBuf >= sizeof(double) * pCmprsor->nVal + 1) { + code = tCompDoubleSwitchToCopy(pCmprsor); + if (code) return code; + } + + if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { + return code; + } + + *ppData = pCmprsor->aBuf[0]; + int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); + if (szComp && szComp < pCmprsor->nBuf) { + pCmprsor->aBuf[0][0] = 1; + *nData = szComp + 1; + } else { + pCmprsor->aBuf[0][0] = 0; + memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); + *nData = pCmprsor->nBuf + 1; + } + } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { + *ppData = pCmprsor->pBuf; + *nData = pCmprsor->nBuf; + } else { + ASSERT(0); + } + return code; } // Binary ===================================================== static int32_t tCompBinaryStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { - int32_t code = 0; - pCmprsor->nBuf[0] = 0; - return code; + pCmprsor->nBuf = 1; + return 0; } static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nData) { int32_t code = 0; if (nData) { - if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf[0] + nData); - if (code) return code; + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + nData))) { + return code; } - memcpy(pCmprsor->aBuf[0] + pCmprsor->nBuf[0], pData, nData); - pCmprsor->nBuf[0] += nData; + memcpy(pCmprsor->pBuf + pCmprsor->nBuf, pData, nData); + pCmprsor->nBuf += nData; } pCmprsor->nVal++; @@ -1647,7 +1874,25 @@ static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nDa static int32_t tCompBinaryEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; - // TODO + + if (pCmprsor->nBuf == 1) return code; + + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf))) { + return code; + } + + int32_t szComp = + LZ4_compress_default(pCmprsor->pBuf + 1, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf - 1, pCmprsor->nBuf - 1); + if (szComp && szComp < pCmprsor->nBuf - 1) { + pCmprsor->aBuf[0][0] = 1; + *ppData = pCmprsor->aBuf[0]; + *nData = szComp + 1; + } else { + pCmprsor->pBuf[0] = 0; + *ppData = pCmprsor->pBuf; + *nData = pCmprsor->nBuf; + } + return code; } @@ -1655,9 +1900,8 @@ static int32_t tCompBinaryEnd(SCompressor *pCmprsor, const uint8_t **ppData, int static const uint8_t BOOL_CMPR_TABLE[] = {0b01, 0b0100, 0b010000, 0b01000000}; static int32_t tCompBoolStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { - int32_t code = 0; - pCmprsor->nBuf[0] = 0; - return code; + pCmprsor->nBuf = 0; + return 0; } static int32_t tCompBool(SCompressor *pCmprsor, const void *pData, int32_t nData) { @@ -1665,19 +1909,18 @@ static int32_t tCompBool(SCompressor *pCmprsor, const void *pData, int32_t nData bool vBool = *(int8_t *)pData; - int32_t mod4 = pCmprsor->nVal & 3; + int32_t mod4 = (pCmprsor->nVal & 3); if (mod4 == 0) { - pCmprsor->nBuf[0]++; + pCmprsor->nBuf++; - if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf[0]); - if (code) return code; + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf))) { + return code; } - pCmprsor->aBuf[0][pCmprsor->nBuf[0] - 1] = 0; + pCmprsor->pBuf[pCmprsor->nBuf - 1] = 0; } if (vBool) { - pCmprsor->aBuf[0][pCmprsor->nBuf[0] - 1] |= BOOL_CMPR_TABLE[mod4]; + pCmprsor->pBuf[pCmprsor->nBuf - 1] |= BOOL_CMPR_TABLE[mod4]; } pCmprsor->nVal++; @@ -1686,7 +1929,30 @@ static int32_t tCompBool(SCompressor *pCmprsor, const void *pData, int32_t nData static int32_t tCompBoolEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; - // TODO + + if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { + return code; + } + + *ppData = pCmprsor->aBuf[0]; + + int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); + if (szComp && szComp < pCmprsor->nBuf) { + pCmprsor->aBuf[0][0] = 1; + *nData = szComp + 1; + } else { + pCmprsor->aBuf[0][0] = 0; + memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); + *nData = pCmprsor->nBuf + 1; + } + } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { + *ppData = pCmprsor->pBuf; + *nData = pCmprsor->nBuf; + } else { + ASSERT(0); + } + return code; } @@ -1697,23 +1963,17 @@ int32_t tCompressorCreate(SCompressor **ppCmprsor) { *ppCmprsor = (SCompressor *)taosMemoryCalloc(1, sizeof(SCompressor)); if ((*ppCmprsor) == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; + return code; } - code = tRealloc(&(*ppCmprsor)->aBuf[0], 1024); - if (code) { - taosMemoryFree(*ppCmprsor); - *ppCmprsor = NULL; - goto _exit; - } - -_exit: return code; } int32_t tCompressorDestroy(SCompressor *pCmprsor) { int32_t code = 0; + tFree(pCmprsor->pBuf); + int32_t nBuf = sizeof(pCmprsor->aBuf) / sizeof(pCmprsor->aBuf[0]); for (int32_t iBuf = 0; iBuf < nBuf; iBuf++) { tFree(pCmprsor->aBuf[iBuf]); @@ -1745,6 +2005,8 @@ int32_t tCompressEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nDa *ppData = NULL; *nData = 0; + if (pCmprsor->nVal == 0) return code; + if (DATA_TYPE_INFO[pCmprsor->type].endFn) { return DATA_TYPE_INFO[pCmprsor->type].endFn(pCmprsor, ppData, nData); } From 4fdb37e887d005cc7c605b51d0bc6f8909532425 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 26 Sep 2022 17:56:47 +0800 Subject: [PATCH 032/143] more code --- source/util/src/tcompression.c | 104 +++++++++++---------------------- 1 file changed, 34 insertions(+), 70 deletions(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 65e8cabe32..ef0a45f3a5 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1191,6 +1191,26 @@ struct SCompressor { }; }; +static int32_t tTwoStageComp(SCompressor *pCmprsor, int32_t *szComp) { + int32_t code = 0; + + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { + return code; + } + + *szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); + if (*szComp && *szComp < pCmprsor->nBuf) { + pCmprsor->aBuf[0][0] = 1; + *szComp += 1; + } else { + pCmprsor->aBuf[0][0] = 0; + memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); + *szComp = pCmprsor->nBuf + 1; + } + + return code; +} + // Timestamp ===================================================== static int32_t tCompTimestampStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; @@ -1205,7 +1225,7 @@ static int32_t tCompTimestampStart(SCompressor *pCmprsor, int8_t type, int8_t cm return code; } -static int32_t tCompSwitchToCopyMode(SCompressor *pCmprsor) { +static int32_t tCompTSSwitchToCopy(SCompressor *pCmprsor) { int32_t code = 0; if (pCmprsor->nVal == 0) goto _exit; @@ -1271,14 +1291,14 @@ static int32_t tCompTimestamp(SCompressor *pCmprsor, const void *pData, int32_t } if (!I64_SAFE_ADD(ts, -pCmprsor->ts_prev_val)) { - code = tCompSwitchToCopyMode(pCmprsor); + code = tCompTSSwitchToCopy(pCmprsor); if (code) return code; goto _copy_cmpr; } int64_t delta = ts - pCmprsor->ts_prev_val; if (!I64_SAFE_ADD(delta, -pCmprsor->ts_prev_delta)) { - code = tCompSwitchToCopyMode(pCmprsor); + code = tCompTSSwitchToCopy(pCmprsor); if (code) return code; goto _copy_cmpr; } @@ -1328,25 +1348,14 @@ static int32_t tCompTimestampEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t code = 0; if (pCmprsor->nBuf >= sizeof(int64_t) * pCmprsor->nVal + 1 && pCmprsor->pBuf[0] == 1) { - code = tCompSwitchToCopyMode(pCmprsor); + code = tCompTSSwitchToCopy(pCmprsor); if (code) return code; } if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { - if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { - return code; - } - + code = tTwoStageComp(pCmprsor, nData); + if (code) return code; *ppData = pCmprsor->aBuf[0]; - int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); - if (szComp && szComp < pCmprsor->nBuf) { - pCmprsor->aBuf[0][0] = 1; - *nData = szComp + 1; - } else { - pCmprsor->aBuf[0][0] = 0; - memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); - *nData = pCmprsor->nBuf + 1; - } } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { *ppData = pCmprsor->pBuf; *nData = pCmprsor->nBuf; @@ -1498,20 +1507,9 @@ static int32_t tCompIntEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_ } if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { - if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { - return code; - } - + code = tTwoStageComp(pCmprsor, nData); + if (code) return code; *ppData = pCmprsor->aBuf[0]; - int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); - if (szComp && szComp < pCmprsor->nBuf) { - pCmprsor->aBuf[0][0] = 1; - *nData = szComp + 1; - } else { - pCmprsor->aBuf[0][0] = 0; - memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); - *nData = pCmprsor->nBuf + 1; - } } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { *ppData = pCmprsor->pBuf; *nData = pCmprsor->nBuf; @@ -1662,20 +1660,9 @@ static int32_t tCompFloatEnd(SCompressor *pCmprsor, const uint8_t **ppData, int3 } if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { - if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { - return code; - } - + code = tTwoStageComp(pCmprsor, nData); + if (code) return code; *ppData = pCmprsor->aBuf[0]; - int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); - if (szComp && szComp < pCmprsor->nBuf) { - pCmprsor->aBuf[0][0] = 1; - *nData = szComp + 1; - } else { - pCmprsor->aBuf[0][0] = 0; - memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); - *nData = pCmprsor->nBuf + 1; - } } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { *ppData = pCmprsor->pBuf; *nData = pCmprsor->nBuf; @@ -1826,20 +1813,9 @@ static int32_t tCompDoubleEnd(SCompressor *pCmprsor, const uint8_t **ppData, int } if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { - if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { - return code; - } - + code = tTwoStageComp(pCmprsor, nData); + if (code) return code; *ppData = pCmprsor->aBuf[0]; - int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); - if (szComp && szComp < pCmprsor->nBuf) { - pCmprsor->aBuf[0][0] = 1; - *nData = szComp + 1; - } else { - pCmprsor->aBuf[0][0] = 0; - memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); - *nData = pCmprsor->nBuf + 1; - } } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { *ppData = pCmprsor->pBuf; *nData = pCmprsor->nBuf; @@ -1931,21 +1907,9 @@ static int32_t tCompBoolEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32 int32_t code = 0; if (pCmprsor->cmprAlg == TWO_STAGE_COMP) { - if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf + 1))) { - return code; - } - + code = tTwoStageComp(pCmprsor, nData); + if (code) return code; *ppData = pCmprsor->aBuf[0]; - - int32_t szComp = LZ4_compress_default(pCmprsor->pBuf, pCmprsor->aBuf[0] + 1, pCmprsor->nBuf, pCmprsor->nBuf); - if (szComp && szComp < pCmprsor->nBuf) { - pCmprsor->aBuf[0][0] = 1; - *nData = szComp + 1; - } else { - pCmprsor->aBuf[0][0] = 0; - memcpy(pCmprsor->aBuf[0] + 1, pCmprsor->pBuf, pCmprsor->nBuf); - *nData = pCmprsor->nBuf + 1; - } } else if (pCmprsor->cmprAlg == ONE_STAGE_COMP) { *ppData = pCmprsor->pBuf; *nData = pCmprsor->nBuf; From 24e899f88b0a43e9cd618ad9126e2ee04e6b7b8d Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 27 Sep 2022 15:40:06 +0800 Subject: [PATCH 033/143] more code --- source/util/src/tcompression.c | 49 ++++++++++------------------------ 1 file changed, 14 insertions(+), 35 deletions(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index ef0a45f3a5..7da55a7bdc 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1032,12 +1032,7 @@ static struct { int32_t (*cmprFn)(SCompressor *, const void *, int32_t nData); int32_t (*endFn)(SCompressor *, const uint8_t **, int32_t *); } DATA_TYPE_INFO[] = { - {.type = TSDB_DATA_TYPE_NULL, - .bytes = 0, - .isVarLen = 0, - .startFn = NULL, - .cmprFn = NULL, - .endFn = NULL}, // TSDB_DATA_TYPE_NULL + {.type = TSDB_DATA_TYPE_NULL, .bytes = 0, .isVarLen = 0, .startFn = NULL, .cmprFn = NULL, .endFn = NULL}, {.type = TSDB_DATA_TYPE_BOOL, .bytes = 1, .isVarLen = 0, @@ -1394,7 +1389,13 @@ static int32_t tCompIntStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) static int32_t tCompIntSwitchToCopy(SCompressor *pCmprsor) { int32_t code = 0; - // ASSERT(0); + + if (pCmprsor->nVal == 0) goto _exit; + + // todo + +_exit: + pCmprsor->pBuf[0] = 1; return code; } @@ -1404,29 +1405,8 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) ASSERT(nData == DATA_TYPE_INFO[pCmprsor->type].bytes); if (pCmprsor->aBuf[0][0] == 0) { - int64_t val; - - switch (pCmprsor->type) { - case TSDB_DATA_TYPE_TINYINT: - case TSDB_DATA_TYPE_UTINYINT: - val = *(int8_t *)pData; - break; - case TSDB_DATA_TYPE_SMALLINT: - case TSDB_DATA_TYPE_USMALLINT: - val = *(int16_t *)pData; - break; - case TSDB_DATA_TYPE_INT: - case TSDB_DATA_TYPE_UINT: - val = *(int32_t *)pData; - break; - case TSDB_DATA_TYPE_BIGINT: - case TSDB_DATA_TYPE_UBIGINT: - val = *(int64_t *)pData; - break; - default: - ASSERT(0); - break; - } + int64_t val = 0; + memcpy(&val, pData, nData); // little-endian only if (!I64_SAFE_ADD(val, -pCmprsor->i_prev)) { code = tCompIntSwitchToCopy(pCmprsor); @@ -1445,16 +1425,16 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) int8_t nBit = (vZigzag) ? (64 - BUILDIN_CLZL(vZigzag)) : 0; pCmprsor->i_prev = val; - while (1) { + for (;;) { int32_t nEle = (pCmprsor->i_end + 241 - pCmprsor->i_start) % 241; if (nEle + 1 <= SELECTOR_TO_ELEMS[pCmprsor->i_selector] && nEle + 1 <= SELECTOR_TO_ELEMS[BIT_TO_SELECTOR[nBit]]) { if (pCmprsor->i_selector < BIT_TO_SELECTOR[nBit]) { pCmprsor->i_selector = BIT_TO_SELECTOR[nBit]; } - pCmprsor->i_end = (pCmprsor->i_end + 1) % 241; pCmprsor->i_aZigzag[pCmprsor->i_end] = vZigzag; pCmprsor->i_aBitN[pCmprsor->i_end] = nBit; + pCmprsor->i_end = (pCmprsor->i_end + 1) % 241; break; } else { while (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { @@ -1462,9 +1442,8 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) } nEle = SELECTOR_TO_ELEMS[pCmprsor->i_selector]; - if (pCmprsor->autoAlloc) { - code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + sizeof(uint64_t)); - if (code) return code; + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + sizeof(uint64_t)))) { + return code; } uint64_t *bp = (uint64_t *)(pCmprsor->pBuf + pCmprsor->nBuf); From 3be4b1d4dfdf1061d0192216ba40a51fd506a3a4 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 27 Sep 2022 16:16:02 +0800 Subject: [PATCH 034/143] finish stream compression --- source/util/src/tcompression.c | 60 +++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 7da55a7bdc..133d1b29b7 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1392,7 +1392,40 @@ static int32_t tCompIntSwitchToCopy(SCompressor *pCmprsor) { if (pCmprsor->nVal == 0) goto _exit; - // todo + int32_t size = DATA_TYPE_INFO[pCmprsor->type].bytes * pCmprsor->nVal + 1; + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->aBuf[0], size))) { + return code; + } + + int32_t n = 1; + int32_t nBuf = 1; + int64_t vPrev = 0; + for (int32_t iVal = 0; iVal < pCmprsor->nVal;) { + uint64_t b; + memcpy(&b, pCmprsor->pBuf + n, sizeof(b)); + n += sizeof(b); + + int32_t i_selector = (b & 0xf); + int32_t nEle = SELECTOR_TO_ELEMS[i_selector]; + uint8_t bits = BIT_PER_INTEGER[i_selector]; + for (int32_t iEle = 0; iEle < nEle; iEle++) { + uint64_t vZigzag = (b >> (bits * iEle + 4)) & (((uint64_t)1 << bits) - 1); + int64_t diff = ZIGZAG_DECODE(int64_t, vZigzag); + vPrev = diff + vPrev; + + memcpy(pCmprsor->aBuf[0] + nBuf, &vPrev, DATA_TYPE_INFO[pCmprsor->type].bytes); + nBuf += DATA_TYPE_INFO[pCmprsor->type].bytes; + } + iVal += nEle; + ASSERT(iVal <= pCmprsor->nVal); + } + + ASSERT(n == pCmprsor->nBuf && nBuf == size); + + uint8_t *pBuf = pCmprsor->pBuf; + pCmprsor->pBuf = pCmprsor->aBuf[0]; + pCmprsor->aBuf[0] = pBuf; + pCmprsor->nBuf = size; _exit: pCmprsor->pBuf[0] = 1; @@ -1480,6 +1513,31 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) static int32_t tCompIntEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; + for (;;) { + int32_t nEle = (pCmprsor->i_end + 241 - pCmprsor->i_start) % 241; + if (nEle == 0) break; + + while (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + pCmprsor->i_selector++; + } + nEle = SELECTOR_TO_ELEMS[pCmprsor->i_selector]; + + if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + sizeof(uint64_t)))) { + return code; + } + + uint64_t *bp = (uint64_t *)(pCmprsor->pBuf + pCmprsor->nBuf); + pCmprsor->nBuf += sizeof(uint64_t); + bp[0] = pCmprsor->i_selector; + uint8_t bits = BIT_PER_INTEGER[pCmprsor->i_selector]; + for (int32_t iVal = 0; iVal < nEle; iVal++) { + bp[0] |= ((pCmprsor->i_aZigzag[pCmprsor->i_start] & ((((uint64_t)1) << bits) - 1)) << (bits * iVal + 4)); + pCmprsor->i_start = (pCmprsor->i_start + 1) % 241; + } + + pCmprsor->i_selector = 0; + } + if (pCmprsor->nBuf >= DATA_TYPE_INFO[pCmprsor->type].bytes * pCmprsor->nVal + 1 && pCmprsor->pBuf[0] == 0) { code = tCompIntSwitchToCopy(pCmprsor); if (code) return code; From dc0d687a06dca97045f9c69ffee258138a06a446 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 27 Sep 2022 16:26:16 +0800 Subject: [PATCH 035/143] make it compile --- source/dnode/vnode/src/tsdb/tsdbCommit.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index a76ce76b85..09b790ee81 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -440,7 +440,7 @@ static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) { pIter->iSttBlk = 0; SSttBlk *pSttBlk = (SSttBlk *)taosArrayGet(pIter->aSttBlk, 0); code = tsdbReadSttBlockEx(pCommitter->dReader.pReader, iStt, pSttBlk, &pIter->bData); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); pIter->iRow = 0; pIter->r.suid = pIter->bData.suid; @@ -1370,8 +1370,9 @@ static int32_t tsdbInitSttBlockBuilderIfNeed(SCommitter *pCommitter, TABLEID id) ASSERT(pCommitter->skmTable.suid == id.suid); ASSERT(pCommitter->skmTable.uid == id.uid); TABLEID tid = {.suid = id.suid, .uid = id.suid ? 0 : id.uid}; - code = tBlockDataInit(pBDatal, &tid, pCommitter->skmTable.pTSchema, NULL, 0); - if (code) goto _exit; + code = + tDiskDataBuilderInit(pCommitter->dWriter.pBuilder, pCommitter->skmTable.pTSchema, &id, pCommitter->cmprAlg, 0); + TSDB_CHECK_CODE(code, lino, _exit); } _exit: @@ -1519,11 +1520,11 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { // impl code = tsdbUpdateTableSchema(pCommitter->pTsdb->pVnode->pMeta, id.suid, id.uid, &pCommitter->skmTable); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tBlockDataInit(&pCommitter->dReader.bData, &id, pCommitter->skmTable.pTSchema, NULL, 0); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); code = tBlockDataInit(&pCommitter->dWriter.bData, &id, pCommitter->skmTable.pTSchema, NULL, 0); - if (code) goto _err; + TSDB_CHECK_CODE(code, lino, _exit); /* merge with data in .data file */ code = tsdbMergeTableData(pCommitter, id); From a4d16f1c0029c245446fba6009b14baca9af1c0f Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 27 Sep 2022 17:36:02 +0800 Subject: [PATCH 036/143] more code --- include/util/tcompression.h | 2 +- source/dnode/vnode/src/inc/tsdb.h | 6 +- source/dnode/vnode/src/tsdb/tsdbCommit.c | 7 +- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 101 +++++++++++++-------- source/util/src/tcompression.c | 15 ++- 5 files changed, 80 insertions(+), 51 deletions(-) diff --git a/include/util/tcompression.h b/include/util/tcompression.h index 8f3d9634ec..84c2922c9e 100644 --- a/include/util/tcompression.h +++ b/include/util/tcompression.h @@ -131,7 +131,7 @@ typedef struct SCompressor SCompressor; int32_t tCompressorCreate(SCompressor **ppCmprsor); int32_t tCompressorDestroy(SCompressor *pCmprsor); int32_t tCompressStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); -int32_t tCompressEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); +int32_t tCompressEnd(SCompressor *pCmprsor, const uint8_t **ppOut, int32_t *nOut, int32_t *nOrigin); int32_t tCompress(SCompressor *pCmprsor, const void *pData, int64_t nData); #ifdef __cplusplus diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 264746e8f2..ca16b87e17 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -326,9 +326,9 @@ int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder); void *tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder); int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TABLEID *pId, uint8_t cmprAlg, uint8_t calcSma); -int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId); -int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData); -int32_t tDiskDataDestroy(SDiskData *pDiskData); +int32_t tDiskDataBuilderClear(SDiskDataBuilder *pBuilder); +int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId); +int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData); // structs ======================= struct STsdbFS { diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 09b790ee81..7bc335d034 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -665,7 +665,7 @@ static int32_t tsdbCommitSttBlk(SDataFWriter *pWriter, SDiskDataBuilder *pBuilde .nRow = pBuilder->nRow}; // gnrt - code = tGnrtDiskData(pBuilder, &pBuilder->dd); + // code = tGnrtDiskData(pBuilder, &pBuilder->dd); TSDB_CHECK_CODE(code, lino, _exit); // write @@ -1369,7 +1369,6 @@ static int32_t tsdbInitSttBlockBuilderIfNeed(SCommitter *pCommitter, TABLEID id) if (!pBuilder->suid && !pBuilder->uid) { ASSERT(pCommitter->skmTable.suid == id.suid); ASSERT(pCommitter->skmTable.uid == id.uid); - TABLEID tid = {.suid = id.suid, .uid = id.suid ? 0 : id.uid}; code = tDiskDataBuilderInit(pCommitter->dWriter.pBuilder, pCommitter->skmTable.pTSchema, &id, pCommitter->cmprAlg, 0); TSDB_CHECK_CODE(code, lino, _exit); @@ -1396,7 +1395,7 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { for (int32_t iRow = 0; iRow < pBData->nRow; iRow++) { TSDBROW row = tsdbRowFromBlockData(pBData, iRow); - code = tDiskDataBuilderAddRow(pCommitter->dWriter.pBuilder, &row, NULL, &id); + code = tDiskDataAddRow(pCommitter->dWriter.pBuilder, &row, NULL, &id); TSDB_CHECK_CODE(code, lino, _exit); if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) { @@ -1435,7 +1434,7 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { pTSchema = pCommitter->skmRow.pTSchema; } - code = tDiskDataBuilderAddRow(pCommitter->dWriter.pBuilder, &pRowInfo->row, pTSchema, &id); + code = tDiskDataAddRow(pCommitter->dWriter.pBuilder, &pRowInfo->row, pTSchema, &id); TSDB_CHECK_CODE(code, lino, _exit); code = tsdbNextCommitRow(pCommitter); diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index bbf4e3337c..8cba73d353 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -31,9 +31,16 @@ struct SDiskColBuilder { SColumnDataAgg sma; uint8_t minSet; uint8_t maxSet; - uint8_t *aBuf[1]; + uint8_t *aBuf[2]; }; +// SDiskData ================================================ +static int32_t tDiskDataDestroy(SDiskData *pDiskData) { + int32_t code = 0; + pDiskData->aDiskCol = taosArrayDestroy(pDiskData->aDiskCol); + return code; +} + // SDiskColBuilder ================================================ #define tDiskColBuilderCreate() \ (SDiskColBuilder) { 0 } @@ -91,7 +98,7 @@ static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { .type = pBuilder->type, .smaOn = pBuilder->calcSma, .flag = pBuilder->flag, - .szOrigin = 0, // todo + .szOrigin = 0, .szBitmap = 0, .szOffset = 0, .szValue = 0, @@ -109,20 +116,27 @@ static int32_t tGnrtDiskCol(SDiskColBuilder *pBuilder, SDiskCol *pDiskCol) { nBit = BIT1_SIZE(pBuilder->nVal); } - pDiskCol->bCol.szBitmap = tsCompressTinyint(pBuilder->pBitMap, nBit, nBit, pBuilder->aBuf[0], 0, pBuilder->cmprAlg, - NULL, 0); // todo: alloc + code = tRealloc(&pBuilder->aBuf[0], nBit + COMP_OVERFLOW_BYTES); + if (code) return code; + + code = tRealloc(&pBuilder->aBuf[1], nBit + COMP_OVERFLOW_BYTES); + if (code) return code; + + pDiskCol->bCol.szBitmap = + tsCompressTinyint(pBuilder->pBitMap, nBit, nBit, pBuilder->aBuf[0], nBit + COMP_OVERFLOW_BYTES, + pBuilder->cmprAlg, pBuilder->aBuf[1], nBit + COMP_OVERFLOW_BYTES); pDiskCol->pBit = pBuilder->aBuf[0]; } // OFFSET if (IS_VAR_DATA_TYPE(pBuilder->type)) { - code = tCompressEnd(pBuilder->pOffC, &pDiskCol->pOff, &pDiskCol->bCol.szOffset); + code = tCompressEnd(pBuilder->pOffC, &pDiskCol->pOff, &pDiskCol->bCol.szOffset, NULL); if (code) return code; } // VALUE if (pBuilder->flag != (HAS_NULL | HAS_NONE)) { - code = tCompressEnd(pBuilder->pValC, &pDiskCol->pVal, &pDiskCol->bCol.szValue); + code = tCompressEnd(pBuilder->pValC, &pDiskCol->pVal, &pDiskCol->bCol.szValue, &pDiskCol->bCol.szOrigin); if (code) return code; } @@ -425,8 +439,8 @@ static int32_t tDiskColAddVal(SDiskColBuilder *pBuilder, SColVal *pColVal) { } } - if (tDiskColAddValImpl[pBuilder->type][pColVal->type]) { - code = tDiskColAddValImpl[pBuilder->type][pColVal->type](pBuilder, pColVal); + if (tDiskColAddValImpl[pBuilder->flag][pColVal->flag]) { + code = tDiskColAddValImpl[pBuilder->flag][pColVal->flag](pBuilder, pColVal); if (code) return code; } @@ -465,6 +479,7 @@ void *tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder) { for (int32_t iBuf = 0; iBuf < sizeof(pBuilder->aBuf) / sizeof(pBuilder->aBuf[0]); iBuf++) { tFree(pBuilder->aBuf[iBuf]); } + tDiskDataDestroy(&pBuilder->dd); taosMemoryFree(pBuilder); return NULL; @@ -474,6 +489,8 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB uint8_t calcSma) { int32_t code = 0; + ASSERT(pId->suid || pId->uid); + pBuilder->suid = pId->suid; pBuilder->uid = pId->uid; pBuilder->nRow = 0; @@ -512,9 +529,9 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB } } - SDiskColBuilder *pDiskColBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, pBuilder->nBuilder); + SDiskColBuilder *pDCBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, pBuilder->nBuilder); - code = tDiskColBuilderInit(pDiskColBuilder, pTColumn->colId, pTColumn->type, cmprAlg, + code = tDiskColBuilderInit(pDCBuilder, pTColumn->colId, pTColumn->type, cmprAlg, (calcSma && (pTColumn->flags & COL_SMA_ON))); if (code) return code; @@ -524,14 +541,22 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB return code; } -int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId) { +int32_t tDiskDataBuilderClear(SDiskDataBuilder *pBuilder) { + int32_t code = 0; + pBuilder->suid = 0; + pBuilder->uid = 0; + return code; +} + +int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId) { int32_t code = 0; + ASSERT(pBuilder->suid || pBuilder->uid); ASSERT(pId->suid == pBuilder->suid); // uid if (pBuilder->uid && pBuilder->uid != pId->uid) { - ASSERT(!pBuilder->calcSma); + ASSERT(pBuilder->suid); for (int32_t iRow = 0; iRow < pBuilder->nRow; iRow++) { code = tCompress(pBuilder->pUidC, &pBuilder->uid, sizeof(int64_t)); if (code) return code; @@ -564,14 +589,13 @@ int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSche pColVal = tRowIterNext(&iter); } - if (pColVal == NULL || pColVal->cid > pDCBuilder->cid) { - SColVal cv = COL_VAL_NONE(pDCBuilder->cid, pDCBuilder->type); - code = tDiskColAddVal(pDCBuilder, &cv); - if (code) return code; - } else { + if (pColVal && pColVal->cid == pDCBuilder->cid) { code = tDiskColAddVal(pDCBuilder, pColVal); if (code) return code; pColVal = tRowIterNext(&iter); + } else { + code = tDiskColAddVal(pDCBuilder, &COL_VAL_NONE(pDCBuilder->cid, pDCBuilder->type)); + if (code) return code; } } pBuilder->nRow++; @@ -579,11 +603,14 @@ int32_t tDiskDataBuilderAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSche return code; } -int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { +int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData) { int32_t code = 0; ASSERT(pBuilder->nRow); + *ppDiskData = NULL; + + SDiskData *pDiskData = &pBuilder->dd; // reset SDiskData pDiskData->hdr = (SDiskDataHdr){.delimiter = TSDB_FILE_DLMT, .fmtVer = 0, @@ -598,6 +625,22 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { pDiskData->pUid = NULL; pDiskData->pVer = NULL; pDiskData->pKey = NULL; + + // UID + if (pBuilder->uid == 0) { + code = tCompressEnd(pBuilder->pUidC, &pDiskData->pUid, &pDiskData->hdr.szUid, NULL); + if (code) return code; + } + + // VERSION + code = tCompressEnd(pBuilder->pVerC, &pDiskData->pVer, &pDiskData->hdr.szVer, NULL); + if (code) return code; + + // TSKEY + code = tCompressEnd(pBuilder->pKeyC, &pDiskData->pKey, &pDiskData->hdr.szKey, NULL); + if (code) return code; + + // aDiskCol if (pDiskData->aDiskCol) { taosArrayClear(pDiskData->aDiskCol); } else { @@ -608,20 +651,6 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { } } - // UID - if (pBuilder->uid == 0) { - code = tCompressEnd(pBuilder->pUidC, &pDiskData->pUid, &pDiskData->hdr.szUid); - if (code) return code; - } - - // VERSION - code = tCompressEnd(pBuilder->pVerC, &pDiskData->pVer, &pDiskData->hdr.szVer); - if (code) return code; - - // TSKEY - code = tCompressEnd(pBuilder->pKeyC, &pDiskData->pKey, &pDiskData->hdr.szKey); - if (code) return code; - int32_t offset = 0; for (int32_t iBuilder = 0; iBuilder < pBuilder->nBuilder; iBuilder++) { SDiskColBuilder *pDCBuilder = (SDiskColBuilder *)taosArrayGet(pBuilder->aBuilder, iBuilder); @@ -644,12 +673,6 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, SDiskData *pDiskData) { pDiskData->hdr.szBlkCol += tPutBlockCol(NULL, &dCol.bCol); } - return code; -} - -// SDiskData ================================================ -int32_t tDiskDataDestroy(SDiskData *pDiskData) { - int32_t code = 0; - pDiskData->aDiskCol = taosArrayDestroy(pDiskData->aDiskCol); + *ppDiskData = pDiskData; return code; } diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 133d1b29b7..8c38b4f20d 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -2000,16 +2000,23 @@ int32_t tCompressStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { return code; } -int32_t tCompressEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { +int32_t tCompressEnd(SCompressor *pCmprsor, const uint8_t **ppOut, int32_t *nOut, int32_t *nOrigin) { int32_t code = 0; - *ppData = NULL; - *nData = 0; + *ppOut = NULL; + *nOut = 0; + if (nOrigin) { + if (DATA_TYPE_INFO[pCmprsor->type].isVarLen) { + *nOrigin = pCmprsor->nBuf - 1; + } else { + *nOrigin = pCmprsor->nVal * DATA_TYPE_INFO[pCmprsor->type].bytes; + } + } if (pCmprsor->nVal == 0) return code; if (DATA_TYPE_INFO[pCmprsor->type].endFn) { - return DATA_TYPE_INFO[pCmprsor->type].endFn(pCmprsor, ppData, nData); + return DATA_TYPE_INFO[pCmprsor->type].endFn(pCmprsor, ppOut, nOut); } return code; From a53575a1524a1f777a2bb180acd339312e76b917 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 27 Sep 2022 17:57:57 +0800 Subject: [PATCH 037/143] more code --- source/dnode/vnode/src/inc/tsdb.h | 13 +++++++++++- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 24 +++++++++++++++++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index ca16b87e17..a928cc725d 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -328,7 +328,8 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB uint8_t calcSma); int32_t tDiskDataBuilderClear(SDiskDataBuilder *pBuilder); int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId); -int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData); +int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData, const SBlkInfo *pBlkInfo); +int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData, const SBlkInfo **ppBlkInfo); // structs ======================= struct STsdbFS { @@ -450,6 +451,15 @@ struct SSmaInfo { int32_t size; }; +typedef struct { + int64_t minUid; + int64_t maxUid; + TSDBKEY minKey; + TSDBKEY maxKey; + int64_t minVer; + int64_t maxVer; +} SBlkInfo; + struct SDataBlk { TSDBKEY minKey; TSDBKEY maxKey; @@ -702,6 +712,7 @@ struct SDiskDataBuilder { SArray *aBuilder; // SArray uint8_t *aBuf[2]; SDiskData dd; + SBlkInfo bi; }; int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid, diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index 8cba73d353..d3ea4f1dda 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -496,6 +496,12 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB pBuilder->nRow = 0; pBuilder->cmprAlg = cmprAlg; pBuilder->calcSma = calcSma; + pBuilder->bi = (SBlkInfo){.minUid = INT64_MAX, + .maxUid = INT64_MIN, + .minKey = TSDBKEY_MAX, + .maxKey = TSDBKEY_MIN, + .minVer = VERSION_MAX, + .maxVer = VERSION_MIN}; if (pBuilder->pUidC == NULL && (code = tCompressorCreate(&pBuilder->pUidC))) return code; code = tCompressStart(pBuilder->pUidC, TSDB_DATA_TYPE_BIGINT, cmprAlg); @@ -554,6 +560,8 @@ int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTS ASSERT(pBuilder->suid || pBuilder->uid); ASSERT(pId->suid == pBuilder->suid); + TSDBKEY key = TSDBROW_KEY(pRow); + // uid if (pBuilder->uid && pBuilder->uid != pId->uid) { ASSERT(pBuilder->suid); @@ -567,16 +575,20 @@ int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTS code = tCompress(pBuilder->pUidC, &pId->uid, sizeof(int64_t)); if (code) return code; } + if (pBuilder->bi.minUid > pId->uid) pBuilder->bi.minUid = pId->uid; + if (pBuilder->bi.maxUid < pId->uid) pBuilder->bi.maxUid = pId->uid; // version - int64_t version = TSDBROW_VERSION(pRow); - code = tCompress(pBuilder->pVerC, &version, sizeof(int64_t)); + code = tCompress(pBuilder->pVerC, &key.version, sizeof(int64_t)); if (code) return code; + if (pBuilder->bi.minVer > key.version) pBuilder->bi.minVer = key.version; + if (pBuilder->bi.maxVer < key.version) pBuilder->bi.maxVer = key.version; // TSKEY - TSKEY ts = TSDBROW_TS(pRow); - code = tCompress(pBuilder->pKeyC, &ts, sizeof(int64_t)); + code = tCompress(pBuilder->pKeyC, &key.ts, sizeof(int64_t)); if (code) return code; + if (tsdbKeyCmprFn(&pBuilder->bi.minKey, &key) > 0) pBuilder->bi.minKey = key; + if (tsdbKeyCmprFn(&pBuilder->bi.maxKey, &key) < 0) pBuilder->bi.maxKey = key; SRowIter iter = {0}; tRowIterInit(&iter, pRow, pTSchema); @@ -603,12 +615,13 @@ int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTS return code; } -int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData) { +int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData, const SBlkInfo **ppBlkInfo) { int32_t code = 0; ASSERT(pBuilder->nRow); *ppDiskData = NULL; + *ppBlkInfo = NULL; SDiskData *pDiskData = &pBuilder->dd; // reset SDiskData @@ -674,5 +687,6 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData) } *ppDiskData = pDiskData; + *ppBlkInfo = &pBuilder->bi; return code; } From 8bd8ff152390f1d7100c316342f2ca339076eb00 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 27 Sep 2022 18:59:29 +0800 Subject: [PATCH 038/143] more code --- source/dnode/vnode/src/inc/tsdb.h | 15 ++- source/dnode/vnode/src/tsdb/tsdbCommit.c | 27 ++--- source/dnode/vnode/src/tsdb/tsdbDiskData.c | 25 +++-- .../dnode/vnode/src/tsdb/tsdbReaderWriter.c | 106 ++++++++++++------ source/dnode/vnode/src/tsdb/tsdbUtil.c | 5 +- 5 files changed, 111 insertions(+), 67 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index a928cc725d..2a627af324 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -74,6 +74,7 @@ typedef struct SLDataIter SLDataIter; typedef struct SDiskCol SDiskCol; typedef struct SDiskData SDiskData; typedef struct SDiskDataBuilder SDiskDataBuilder; +typedef struct SBlkInfo SBlkInfo; #define TSDB_FILE_DLMT ((uint32_t)0xF00AFA0F) #define TSDB_MAX_SUBBLOCKS 8 @@ -173,7 +174,7 @@ int32_t tCmprBlockData(SBlockData *pBlockData, int8_t cmprAlg, uint8_t **ppOut int32_t aBufN[]); int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uint8_t *aBuf[]); // SDiskDataHdr -int32_t tPutDiskDataHdr(uint8_t *p, void *ph); +int32_t tPutDiskDataHdr(uint8_t *p, const SDiskDataHdr *pHdr); int32_t tGetDiskDataHdr(uint8_t *p, void *ph); // SDelIdx int32_t tPutDelIdx(uint8_t *p, void *ph); @@ -270,6 +271,7 @@ int32_t tsdbWriteDataBlk(SDataFWriter *pWriter, SMapData *mDataBlk, SBlockIdx *p int32_t tsdbWriteSttBlk(SDataFWriter *pWriter, SArray *aSttBlk); int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, SBlockInfo *pBlkInfo, SSmaInfo *pSmaInfo, int8_t cmprAlg, int8_t toLast); +int32_t tsdbWriteDiskData(SDataFWriter *pWriter, const SDiskData *pDiskData, SBlockInfo *pBlkInfo, SSmaInfo *pSmaInfo); int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo); // SDataFReader @@ -328,7 +330,6 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB uint8_t calcSma); int32_t tDiskDataBuilderClear(SDiskDataBuilder *pBuilder); int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTSchema, TABLEID *pId); -int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData, const SBlkInfo *pBlkInfo); int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData, const SBlkInfo **ppBlkInfo); // structs ======================= @@ -451,14 +452,16 @@ struct SSmaInfo { int32_t size; }; -typedef struct { +struct SBlkInfo { int64_t minUid; int64_t maxUid; - TSDBKEY minKey; - TSDBKEY maxKey; + TSKEY minKey; + TSKEY maxKey; int64_t minVer; int64_t maxVer; -} SBlkInfo; + TSDBKEY minTKey; + TSDBKEY maxTKey; +}; struct SDataBlk { TSDBKEY minKey; diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 7bc335d034..1a0534df5c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -542,6 +542,7 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { taosArrayClear(pCommitter->dWriter.aSttBlk); tMapDataReset(&pCommitter->dWriter.mBlock); tBlockDataReset(&pCommitter->dWriter.bData); + tDiskDataBuilderClear(pCommitter->dWriter.pBuilder); // open iter code = tsdbOpenCommitIter(pCommitter); @@ -655,21 +656,21 @@ static int32_t tsdbCommitSttBlk(SDataFWriter *pWriter, SDiskDataBuilder *pBuilde if (pBuilder->nRow == 0) return code; - SSttBlk sttBlk = {.suid = pBuilder->suid, - .minUid = 0, // todo - .maxUid = 0, // todo - .minKey = 0, // todo - .maxKey = 0, // todo - .minVer = 0, // todo - .maxVer = 0, // todo - .nRow = pBuilder->nRow}; - // gnrt - // code = tGnrtDiskData(pBuilder, &pBuilder->dd); + const SDiskData *pDiskData; + const SBlkInfo *pBlkInfo; + code = tGnrtDiskData(pBuilder, &pDiskData, &pBlkInfo); TSDB_CHECK_CODE(code, lino, _exit); + SSttBlk sttBlk = {.suid = pBuilder->suid, + .minUid = pBlkInfo->minUid, + .maxUid = pBlkInfo->maxUid, + .minKey = pBlkInfo->minKey, + .maxKey = pBlkInfo->maxKey, + .minVer = pBlkInfo->minVer, + .maxVer = pBlkInfo->maxVer}; // write - // code = tsdbWriteDiskData(pWriter, &pBuilder->dd); + code = tsdbWriteDiskData(pWriter, pDiskData, &sttBlk.bInfo, NULL); TSDB_CHECK_CODE(code, lino, _exit); // push @@ -678,8 +679,8 @@ static int32_t tsdbCommitSttBlk(SDataFWriter *pWriter, SDiskDataBuilder *pBuilde TSDB_CHECK_CODE(code, lino, _exit); } - // clear (todo) - // tDiskDataBuilderClear(pBuilder); + // clear + tDiskDataBuilderClear(pBuilder); _exit: if (code) { diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c index d3ea4f1dda..43be51a694 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c +++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c @@ -498,10 +498,12 @@ int32_t tDiskDataBuilderInit(SDiskDataBuilder *pBuilder, STSchema *pTSchema, TAB pBuilder->calcSma = calcSma; pBuilder->bi = (SBlkInfo){.minUid = INT64_MAX, .maxUid = INT64_MIN, - .minKey = TSDBKEY_MAX, - .maxKey = TSDBKEY_MIN, + .minKey = TSKEY_MAX, + .maxKey = TSKEY_MIN, .minVer = VERSION_MAX, - .maxVer = VERSION_MIN}; + .maxVer = VERSION_MIN, + .minTKey = TSDBKEY_MAX, + .maxTKey = TSDBKEY_MIN}; if (pBuilder->pUidC == NULL && (code = tCompressorCreate(&pBuilder->pUidC))) return code; code = tCompressStart(pBuilder->pUidC, TSDB_DATA_TYPE_BIGINT, cmprAlg); @@ -551,6 +553,7 @@ int32_t tDiskDataBuilderClear(SDiskDataBuilder *pBuilder) { int32_t code = 0; pBuilder->suid = 0; pBuilder->uid = 0; + pBuilder->nRow = 0; return code; } @@ -560,7 +563,9 @@ int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTS ASSERT(pBuilder->suid || pBuilder->uid); ASSERT(pId->suid == pBuilder->suid); - TSDBKEY key = TSDBROW_KEY(pRow); + TSDBKEY kRow = TSDBROW_KEY(pRow); + if (tsdbKeyCmprFn(&pBuilder->bi.minTKey, &kRow) > 0) pBuilder->bi.minTKey = kRow; + if (tsdbKeyCmprFn(&pBuilder->bi.maxTKey, &kRow) < 0) pBuilder->bi.maxTKey = kRow; // uid if (pBuilder->uid && pBuilder->uid != pId->uid) { @@ -579,16 +584,16 @@ int32_t tDiskDataAddRow(SDiskDataBuilder *pBuilder, TSDBROW *pRow, STSchema *pTS if (pBuilder->bi.maxUid < pId->uid) pBuilder->bi.maxUid = pId->uid; // version - code = tCompress(pBuilder->pVerC, &key.version, sizeof(int64_t)); + code = tCompress(pBuilder->pVerC, &kRow.version, sizeof(int64_t)); if (code) return code; - if (pBuilder->bi.minVer > key.version) pBuilder->bi.minVer = key.version; - if (pBuilder->bi.maxVer < key.version) pBuilder->bi.maxVer = key.version; + if (pBuilder->bi.minVer > kRow.version) pBuilder->bi.minVer = kRow.version; + if (pBuilder->bi.maxVer < kRow.version) pBuilder->bi.maxVer = kRow.version; // TSKEY - code = tCompress(pBuilder->pKeyC, &key.ts, sizeof(int64_t)); + code = tCompress(pBuilder->pKeyC, &kRow.ts, sizeof(int64_t)); if (code) return code; - if (tsdbKeyCmprFn(&pBuilder->bi.minKey, &key) > 0) pBuilder->bi.minKey = key; - if (tsdbKeyCmprFn(&pBuilder->bi.maxKey, &key) < 0) pBuilder->bi.maxKey = key; + if (pBuilder->bi.minKey > kRow.ts) pBuilder->bi.minKey = kRow.ts; + if (pBuilder->bi.maxKey < kRow.ts) pBuilder->bi.maxKey = kRow.ts; SRowIter iter = {0}; tRowIterInit(&iter, pRow, pTSchema); diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index 4352595d88..00b6830fbc 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -522,9 +522,6 @@ static int32_t tsdbWriteBlockSma(SDataFWriter *pWriter, SBlockData *pBlockData, // write if (pSmaInfo->size) { - code = tRealloc(&pWriter->aBuf[0], pSmaInfo->size); - if (code) goto _err; - code = tsdbWriteFile(pWriter->pSmaFD, pWriter->fSma.size, pWriter->aBuf[0], pSmaInfo->size); if (code) goto _err; @@ -607,12 +604,20 @@ _err: return code; } -int32_t tsdbWriteDiskData(SDataFWriter *pWriter, SDiskData *pDiskData, SBlockInfo *pBlkInfo) { +int32_t tsdbWriteDiskData(SDataFWriter *pWriter, const SDiskData *pDiskData, SBlockInfo *pBlkInfo, SSmaInfo *pSmaInfo) { int32_t code = 0; int32_t lino = 0; - STsdbFD *pFD = pWriter->pDataFD; // todo - int64_t offset = pWriter->fData.size; + STsdbFD *pFD = NULL; + if (pSmaInfo) { + pFD = pWriter->pDataFD; + pBlkInfo->offset = pWriter->fData.size; + } else { + pFD = pWriter->pSttFD; + pBlkInfo->offset = pWriter->fStt[pWriter->wSet.nSttF - 1].size; + } + pBlkInfo->szBlock = 0; + pBlkInfo->szKey = 0; // hdr int32_t n = tPutDiskDataHdr(NULL, &pDiskData->hdr); @@ -621,26 +626,30 @@ int32_t tsdbWriteDiskData(SDataFWriter *pWriter, SDiskData *pDiskData, SBlockInf tPutDiskDataHdr(pWriter->aBuf[0], &pDiskData->hdr); - code = tsdbWriteFile(pFD, offset, pWriter->aBuf[0], n); + code = tsdbWriteFile(pFD, pBlkInfo->offset, pWriter->aBuf[0], n); TSDB_CHECK_CODE(code, lino, _exit); - offset += n; + pBlkInfo->szKey += n; + pBlkInfo->szBlock += n; // uid + ver + key - if (pDiskData->hdr.szUid) { - code = tsdbWriteFile(pFD, offset, pDiskData->pUid, pDiskData->hdr.szUid); + if (pDiskData->pUid) { + code = tsdbWriteFile(pFD, pBlkInfo->offset + pBlkInfo->szBlock, pDiskData->pUid, pDiskData->hdr.szUid); TSDB_CHECK_CODE(code, lino, _exit); - offset += pDiskData->hdr.szUid; + pBlkInfo->szKey += pDiskData->hdr.szUid; + pBlkInfo->szBlock += pDiskData->hdr.szUid; } - code = tsdbWriteFile(pFD, offset, pDiskData->pVer, pDiskData->hdr.szVer); + code = tsdbWriteFile(pFD, pBlkInfo->offset + pBlkInfo->szBlock, pDiskData->pVer, pDiskData->hdr.szVer); TSDB_CHECK_CODE(code, lino, _exit); - offset += pDiskData->hdr.szVer; + pBlkInfo->szKey += pDiskData->hdr.szVer; + pBlkInfo->szBlock += pDiskData->hdr.szVer; - code = tsdbWriteFile(pFD, offset, pDiskData->pKey, pDiskData->hdr.szKey); + code = tsdbWriteFile(pFD, pBlkInfo->offset + pBlkInfo->szBlock, pDiskData->pKey, pDiskData->hdr.szKey); TSDB_CHECK_CODE(code, lino, _exit); - offset += pDiskData->hdr.szKey; + pBlkInfo->szKey += pDiskData->hdr.szKey; + pBlkInfo->szBlock += pDiskData->hdr.szKey; - // SBlockCol + // aBlockCol if (pDiskData->hdr.szBlkCol) { code = tRealloc(&pWriter->aBuf[0], pDiskData->hdr.szBlkCol); TSDB_CHECK_CODE(code, lino, _exit); @@ -648,48 +657,75 @@ int32_t tsdbWriteDiskData(SDataFWriter *pWriter, SDiskData *pDiskData, SBlockInf n = 0; for (int32_t iDiskCol = 0; iDiskCol < taosArrayGetSize(pDiskData->aDiskCol); iDiskCol++) { SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); - - n += tPutBlockCol(pWriter->aBuf[0] + n, &pDiskCol->bCol); + n += tPutBlockCol(pWriter->aBuf[0] + n, pDiskCol); } - ASSERT(n == pDiskData->hdr.szBlkCol); - code = tsdbWriteFile(pFD, offset, pWriter->aBuf[0], pDiskData->hdr.szBlkCol); + code = tsdbWriteFile(pFD, pBlkInfo->offset + pBlkInfo->szBlock, pWriter->aBuf[0], pDiskData->hdr.szBlkCol); TSDB_CHECK_CODE(code, lino, _exit); - offset += pDiskData->hdr.szBlkCol; + pBlkInfo->szBlock += pDiskData->hdr.szBlkCol; } - // pData + // aDiskCol for (int32_t iDiskCol = 0; iDiskCol < taosArrayGetSize(pDiskData->aDiskCol); iDiskCol++) { SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); - if (pDiskCol->bCol.flag == HAS_NULL) continue; - - if (pDiskCol->bCol.szBitmap) { - code = tsdbWriteFile(pFD, offset, pDiskCol->pBit, pDiskCol->bCol.szBitmap); + if (pDiskCol->pBit) { + code = tsdbWriteFile(pFD, pBlkInfo->offset + pBlkInfo->szBlock, pDiskCol->pBit, pDiskCol->bCol.szBitmap); TSDB_CHECK_CODE(code, lino, _exit); - offset += pDiskCol->bCol.szBitmap; + + pBlkInfo->szBlock += pDiskCol->bCol.szBitmap; } - if (pDiskCol->bCol.szOffset) { - code = tsdbWriteFile(pFD, offset, pDiskCol->pOff, pDiskCol->bCol.szOffset); + if (pDiskCol->pOff) { + code = tsdbWriteFile(pFD, pBlkInfo->offset + pBlkInfo->szBlock, pDiskCol->pOff, pDiskCol->bCol.szOffset); TSDB_CHECK_CODE(code, lino, _exit); - offset += pDiskCol->bCol.szOffset; + + pBlkInfo->szBlock += pDiskCol->bCol.szOffset; } - if (pDiskCol->bCol.szValue) { - code = tsdbWriteFile(pFD, offset, pDiskCol->pVal, pDiskCol->bCol.szValue); + if (pDiskCol->pVal) { + code = tsdbWriteFile(pFD, pBlkInfo->offset + pBlkInfo->szBlock, pDiskCol->pVal, pDiskCol->bCol.szValue); TSDB_CHECK_CODE(code, lino, _exit); - offset += pDiskCol->bCol.szValue; + + pBlkInfo->szBlock += pDiskCol->bCol.szValue; } } + if (pSmaInfo) { + pWriter->fData.size += pBlkInfo->szBlock; + } else { + pWriter->fStt[pWriter->wSet.nSttF - 1].size += pBlkInfo->szBlock; + goto _exit; + } + + pSmaInfo->offset = 0; + pSmaInfo->size = 0; + for (int32_t iDiskCol = 0; iDiskCol < taosArrayGetSize(pDiskData->aDiskCol); iDiskCol++) { + SDiskCol *pDiskCol = (SDiskCol *)taosArrayGet(pDiskData->aDiskCol, iDiskCol); + + if (IS_VAR_DATA_TYPE(pDiskCol->bCol.type)) continue; + if (pDiskCol->bCol.flag == HAS_NULL || pDiskCol->bCol.flag == (HAS_NULL | HAS_NONE)) continue; + if (!pDiskCol->bCol.smaOn) continue; + + code = tRealloc(&pWriter->aBuf[0], pSmaInfo->size + tPutColumnDataAgg(NULL, &pDiskCol->agg)); + TSDB_CHECK_CODE(code, lino, _exit); + pSmaInfo->size += tPutColumnDataAgg(pWriter->aBuf[0] + pSmaInfo->size, &pDiskCol->agg); + } + + if (pSmaInfo->size) { + pSmaInfo->offset = pWriter->fSma.size; + + code = tsdbWriteFile(pWriter->pSmaFD, pSmaInfo->offset, pWriter->aBuf[0], pSmaInfo->size); + TSDB_CHECK_CODE(code, lino, _exit); + + pWriter->fSma.size += pSmaInfo->size; + } + _exit: if (code) { tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pWriter->pTsdb->pVnode), __func__, lino, tstrerror(code)); - } else { - tsdbDebug("vgId:%d %s", TD_VID(pWriter->pTsdb->pVnode), __func__); } return code; } diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 8b95d15407..47c836d9c1 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -1454,9 +1454,8 @@ _exit: } // SDiskDataHdr ============================== -int32_t tPutDiskDataHdr(uint8_t *p, void *ph) { - int32_t n = 0; - SDiskDataHdr *pHdr = (SDiskDataHdr *)ph; +int32_t tPutDiskDataHdr(uint8_t *p, const SDiskDataHdr *pHdr) { + int32_t n = 0; n += tPutU32(p ? p + n : p, pHdr->delimiter); n += tPutU32v(p ? p + n : p, pHdr->fmtVer); From 18f3bd53c577c8ce50d5daa2fd90872d602d1652 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 27 Sep 2022 23:34:06 +0800 Subject: [PATCH 039/143] fix code --- source/dnode/vnode/src/tsdb/tsdbCommit.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 1a0534df5c..99603500ae 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -1364,14 +1364,15 @@ static int32_t tsdbInitSttBlockBuilderIfNeed(SCommitter *pCommitter, TABLEID id) if (!TABLE_SAME_SCHEMA(pBuilder->suid, pBuilder->uid, id.suid, id.uid)) { code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pBuilder, pCommitter->dWriter.aSttBlk); TSDB_CHECK_CODE(code, lino, _exit); + + tDiskDataBuilderClear(pBuilder); } } if (!pBuilder->suid && !pBuilder->uid) { ASSERT(pCommitter->skmTable.suid == id.suid); ASSERT(pCommitter->skmTable.uid == id.uid); - code = - tDiskDataBuilderInit(pCommitter->dWriter.pBuilder, pCommitter->skmTable.pTSchema, &id, pCommitter->cmprAlg, 0); + code = tDiskDataBuilderInit(pBuilder, pCommitter->skmTable.pTSchema, &id, pCommitter->cmprAlg, 0); TSDB_CHECK_CODE(code, lino, _exit); } @@ -1388,8 +1389,8 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { int32_t lino = 0; SBlockData *pBData = &pCommitter->dWriter.bData; + TABLEID id = {.suid = pBData->suid, .uid = pBData->uid}; - TABLEID id = {.suid = pBData->suid, .uid = pBData->uid}; code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id); TSDB_CHECK_CODE(code, lino, _exit); @@ -1402,6 +1403,9 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) { code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk); TSDB_CHECK_CODE(code, lino, _exit); + + code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id); + TSDB_CHECK_CODE(code, lino, _exit); } } @@ -1425,7 +1429,8 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { if (pRowInfo == NULL) goto _exit; if (pCommitter->toLastOnly) { - // init the data if need + code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id); + TSDB_CHECK_CODE(code, lino, _exit); while (pRowInfo) { STSchema *pTSchema = NULL; @@ -1449,6 +1454,9 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) { code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk); TSDB_CHECK_CODE(code, lino, _exit); + + code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id); + TSDB_CHECK_CODE(code, lino, _exit); } } } else { From 27b6290f6bb5e50294abc85a452d681f93b1f4b6 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 28 Sep 2022 09:56:28 +0800 Subject: [PATCH 040/143] fix compression bug --- source/util/src/tcompression.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 8c38b4f20d..003843c5bb 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1379,7 +1379,7 @@ static int32_t tCompIntStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) pCmprsor->i_end = 0; pCmprsor->nBuf = 1; - code = tRealloc(&pCmprsor->aBuf[0], pCmprsor->nBuf); + code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf); if (code) return code; pCmprsor->pBuf[0] = 0; @@ -1437,7 +1437,7 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) ASSERT(nData == DATA_TYPE_INFO[pCmprsor->type].bytes); - if (pCmprsor->aBuf[0][0] == 0) { + if (pCmprsor->pBuf[0] == 0) { int64_t val = 0; memcpy(&val, pData, nData); // little-endian only From df84baad12b559810083fadc111385299ad1a1fe Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 28 Sep 2022 10:12:10 +0800 Subject: [PATCH 041/143] fix another bug --- source/util/src/tcompression.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 003843c5bb..dc473922d7 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -999,7 +999,7 @@ int32_t tsDecompressDoubleLossyImp(const char *input, int32_t compressedSize, co /************************************************************************* * STREAM COMPRESSION *************************************************************************/ -#define I64_SAFE_ADD(a, b) (((a) >= 0 && (b) <= INT64_MAX - (b)) || ((a) < 0 && (b) >= INT64_MIN - (a))) +#define I64_SAFE_ADD(a, b) (((a) >= 0 && (b) <= INT64_MAX - (a)) || ((a) < 0 && (b) >= INT64_MIN - (a))) static int32_t tCompBoolStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompBool(SCompressor *pCmprsor, const void *pData, int32_t nData); From 0e8aaf4c9e6ee7a13941bf7bbcdd39e85aec33d4 Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Wed, 28 Sep 2022 10:38:49 +0800 Subject: [PATCH 042/143] feat(tmq): push optimization --- include/libs/executor/executor.h | 14 ++-- source/dnode/vnode/inc/vnode.h | 2 +- source/dnode/vnode/src/inc/tq.h | 18 ++++- source/dnode/vnode/src/tq/tq.c | 96 +++++++++++++++++++++++-- source/dnode/vnode/src/tq/tqExec.c | 6 +- source/dnode/vnode/src/tq/tqPush.c | 74 +++++++++++++++++++ source/dnode/vnode/src/tq/tqRead.c | 63 ++++++++-------- source/dnode/vnode/src/vnd/vnodeSvr.c | 4 +- source/libs/executor/inc/executorimpl.h | 1 + source/libs/executor/src/executor.c | 10 ++- source/libs/executor/src/scanoperator.c | 35 +++++++++ 11 files changed, 271 insertions(+), 52 deletions(-) diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index 8c1d957381..1049599a56 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -29,13 +29,13 @@ typedef void* DataSinkHandle; struct SRpcMsg; struct SSubplan; -typedef int32_t (*localFetchFp)(void *, uint64_t, uint64_t, uint64_t, int64_t, int32_t, void**, SArray*); +typedef int32_t (*localFetchFp)(void*, uint64_t, uint64_t, uint64_t, int64_t, int32_t, void**, SArray*); typedef struct { - void *handle; + void* handle; bool localExec; localFetchFp fp; - SArray *explainRes; + SArray* explainRes; } SLocalFetch; typedef struct { @@ -51,9 +51,9 @@ typedef struct { bool initTqReader; int32_t numOfVgroups; - void* sContext; // SSnapContext* + void* sContext; // SSnapContext* - void* pStateBackend; + void* pStateBackend; } SReadHandle; // in queue mode, data streams are seperated by msg @@ -136,7 +136,7 @@ int32_t qGetQueryTableSchemaVersion(qTaskInfo_t tinfo, char* dbName, char* table * @param handle * @return */ -int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, SLocalFetch *pLocal); +int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, SLocalFetch* pLocal); int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pBlock, uint64_t* useconds); /** @@ -195,6 +195,8 @@ int32_t qStreamPrepareTsdbScan(qTaskInfo_t tinfo, uint64_t uid, int64_t ts); int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subType); +int32_t qStreamScanMemData(qTaskInfo_t tinfo, const SSubmitReq* pReq); + int32_t qStreamExtractOffset(qTaskInfo_t tinfo, STqOffsetVal* pOffset); SMqMetaRsp* qStreamExtractMetaMsg(qTaskInfo_t tinfo); diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 6ba10641f5..f0fb8d4b02 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -217,7 +217,7 @@ int32_t tqReaderRemoveTbUidList(STqReader *pReader, const SArray *tbUidList); int32_t tqSeekVer(STqReader *pReader, int64_t ver); int32_t tqNextBlock(STqReader *pReader, SFetchRet *ret); -int32_t tqReaderSetDataMsg(STqReader *pReader, SSubmitReq *pMsg, int64_t ver); +int32_t tqReaderSetDataMsg(STqReader *pReader, const SSubmitReq *pMsg, int64_t ver); bool tqNextDataBlock(STqReader *pReader); bool tqNextDataBlockFilterOut(STqReader *pReader, SHashObj *filterOutUids); int32_t tqRetrieveDataBlock(SSDataBlock *pBlock, STqReader *pReader); diff --git a/source/dnode/vnode/src/inc/tq.h b/source/dnode/vnode/src/inc/tq.h index c3441a43f0..04b0813445 100644 --- a/source/dnode/vnode/src/inc/tq.h +++ b/source/dnode/vnode/src/inc/tq.h @@ -113,10 +113,20 @@ typedef struct { } STqHandle; +typedef struct { + SMqDataRsp dataRsp; + SMqRspHead rspHead; + STqHandle* pHandle; + SRpcHandleInfo pInfo; +} STqPushEntry; + struct STQ { - SVnode* pVnode; - char* path; - SHashObj* pPushMgr; // consumerId -> STqHandle* + SVnode* pVnode; + char* path; + + SRWLatch pushLock; + + SHashObj* pPushMgr; // consumerId -> STqPushEntry SHashObj* pHandle; // subKey -> STqHandle SHashObj* pCheckInfo; // topic -> SAlterCheckInfo @@ -146,7 +156,9 @@ int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHea // tqExec int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SSubmitReq* pReq, STaosxRsp* pRsp); +int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t numOfCols); int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, const SMqDataRsp* pRsp); +int32_t tqPushDataRsp(STQ* pTq, STqPushEntry* pPushEntry); // tqMeta int32_t tqMetaOpen(STQ* pTq); diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 76f3c1b12d..21136405cb 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -78,7 +78,9 @@ STQ* tqOpen(const char* path, SVnode* pVnode) { taosHashSetFreeFp(pTq->pHandle, destroySTqHandle); - pTq->pPushMgr = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_ENTRY_LOCK); + taosInitRWLatch(&pTq->pushLock); + pTq->pPushMgr = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); + taosHashSetFreeFp(pTq->pPushMgr, taosMemoryFree); pTq->pCheckInfo = taosHashInit(64, MurmurHash3_32, true, HASH_ENTRY_LOCK); @@ -153,6 +155,65 @@ int32_t tqSendMetaPollRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, return 0; } +int32_t tqPushDataRsp(STQ* pTq, STqPushEntry* pPushEntry) { + SMqDataRsp* pRsp = &pPushEntry->dataRsp; + + ASSERT(taosArrayGetSize(pRsp->blockData) == pRsp->blockNum); + ASSERT(taosArrayGetSize(pRsp->blockDataLen) == pRsp->blockNum); + + ASSERT(!pRsp->withSchema); + ASSERT(taosArrayGetSize(pRsp->blockSchema) == 0); + + if (pRsp->reqOffset.type == TMQ_OFFSET__LOG) { + if (pRsp->blockNum > 0) { + ASSERT(pRsp->rspOffset.version > pRsp->reqOffset.version); + } else { + ASSERT(pRsp->rspOffset.version >= pRsp->reqOffset.version); + } + } + + int32_t len = 0; + int32_t code = 0; + tEncodeSize(tEncodeSMqDataRsp, pRsp, len, code); + + if (code < 0) { + return -1; + } + + int32_t tlen = sizeof(SMqRspHead) + len; + void* buf = rpcMallocCont(tlen); + if (buf == NULL) { + return -1; + } + + memcpy(buf, &pPushEntry->rspHead, sizeof(SMqRspHead)); + + void* abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead)); + + SEncoder encoder = {0}; + tEncoderInit(&encoder, abuf, len); + tEncodeSMqDataRsp(&encoder, pRsp); + tEncoderClear(&encoder); + + SRpcMsg rsp = { + .info = pPushEntry->pInfo, + .pCont = buf, + .contLen = tlen, + .code = 0, + }; + + tmsgSendRsp(&rsp); + + char buf1[80] = {0}; + char buf2[80] = {0}; + tFormatOffset(buf1, 80, &pRsp->reqOffset); + tFormatOffset(buf2, 80, &pRsp->rspOffset); + tqDebug("vgId:%d, from consumer:%" PRId64 ", (epoch %d) push rsp, block num: %d, reqOffset:%s, rspOffset:%s", + TD_VID(pTq->pVnode), pRsp->head.consumerId, pRsp->head.epoch, pRsp->blockNum, buf1, buf2); + + return 0; +} + int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, const SMqDataRsp* pRsp) { ASSERT(taosArrayGetSize(pRsp->blockData) == pRsp->blockNum); ASSERT(taosArrayGetSize(pRsp->blockDataLen) == pRsp->blockNum); @@ -477,11 +538,31 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) { if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) { SMqDataRsp dataRsp = {0}; tqInitDataRsp(&dataRsp, pReq, pHandle->execHandle.subType); + // lock + taosWLockLatch(&pTq->pushLock); tqScanData(pTq, pHandle, &dataRsp, &fetchOffsetNew); #if 1 - + if (dataRsp.blockNum == 0) { + STqPushEntry* pPushEntry = taosMemoryCalloc(1, sizeof(STqPushEntry)); + if (pPushEntry != NULL) { + pPushEntry->pHandle = pHandle; + pPushEntry->pInfo = pMsg->info; + memcpy(&pPushEntry->dataRsp, &dataRsp, sizeof(SMqDataRsp)); + pPushEntry->rspHead.consumerId = consumerId; + pPushEntry->rspHead.epoch = reqEpoch; + pPushEntry->rspHead.mqMsgType = TMQ_MSG_TYPE__POLL_RSP; + taosHashPut(pTq->pPushMgr, pHandle->subKey, strlen(pHandle->subKey) + 1, &pPushEntry, sizeof(void*)); + tqDebug("tmq poll: consumer %ld, subkey %s, vg %d save handle to push mgr", consumerId, pHandle->subKey, + TD_VID(pTq->pVnode)); + // unlock + taosWUnLockLatch(&pTq->pushLock); + return 0; + } + } + taosWUnLockLatch(&pTq->pushLock); #endif + if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) { code = -1; } @@ -615,9 +696,14 @@ int32_t tqProcessVgDeleteReq(STQ* pTq, int64_t version, char* msg, int32_t msgLe SMqVDeleteReq* pReq = (SMqVDeleteReq*)msg; int32_t code = taosHashRemove(pTq->pHandle, pReq->subKey, strlen(pReq->subKey)); - ASSERT(code == 0); + if (code != 0) { + tqError("cannot process tq delete req %s, since no such handle", pReq->subKey); + } - tqOffsetDelete(pTq->pOffsetStore, pReq->subKey); + code = tqOffsetDelete(pTq->pOffsetStore, pReq->subKey); + if (code != 0) { + tqError("cannot process tq delete req %s, since no such offset", pReq->subKey); + } if (tqMetaDeleteHandle(pTq, pReq->subKey) < 0) { ASSERT(0); @@ -756,7 +842,9 @@ int32_t tqProcessVgChangeReq(STQ* pTq, int64_t version, char* msg, int32_t msgLe atomic_add_fetch_32(&pHandle->epoch, 1); if (tqMetaSaveHandle(pTq, req.subKey, pHandle) < 0) { // TODO + ASSERT(0); } + // close handle } return 0; diff --git a/source/dnode/vnode/src/tq/tqExec.c b/source/dnode/vnode/src/tq/tqExec.c index a24f920235..58d051bec1 100644 --- a/source/dnode/vnode/src/tq/tqExec.c +++ b/source/dnode/vnode/src/tq/tqExec.c @@ -15,7 +15,7 @@ #include "tq.h" -static int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t numOfCols) { +int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t numOfCols) { int32_t dataStrLen = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock); void* buf = taosMemoryCalloc(1, dataStrLen); if (buf == NULL) return -1; @@ -243,7 +243,7 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SSubmitReq* pReq, STaosxRsp } if (pHandle->fetchMeta) { SSubmitBlk* pBlk = pReader->pBlock; - int32_t schemaLen = htonl(pBlk->schemaLen); + int32_t schemaLen = htonl(pBlk->schemaLen); if (schemaLen > 0) { if (pRsp->createTableNum == 0) { pRsp->createTableLen = taosArrayInit(0, sizeof(int32_t)); @@ -278,7 +278,7 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SSubmitReq* pReq, STaosxRsp } if (pHandle->fetchMeta) { SSubmitBlk* pBlk = pReader->pBlock; - int32_t schemaLen = htonl(pBlk->schemaLen); + int32_t schemaLen = htonl(pBlk->schemaLen); if (schemaLen > 0) { if (pRsp->createTableNum == 0) { pRsp->createTableLen = taosArrayInit(0, sizeof(int32_t)); diff --git a/source/dnode/vnode/src/tq/tqPush.c b/source/dnode/vnode/src/tq/tqPush.c index a57e8174fe..c42cfeb7b8 100644 --- a/source/dnode/vnode/src/tq/tqPush.c +++ b/source/dnode/vnode/src/tq/tqPush.c @@ -213,6 +213,80 @@ int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_ #endif int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) { + if (msgType == TDMT_VND_SUBMIT) { + // lock push mgr to avoid potential msg lost + taosWLockLatch(&pTq->pushLock); + if (taosHashGetSize(pTq->pPushMgr) != 0) { + SArray* cachedKeys = taosArrayInit(0, sizeof(void*)); + SArray* cachedKeyLens = taosArrayInit(0, sizeof(size_t)); + void* data = taosMemoryMalloc(msgLen); + if (data == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + tqError("failed to copy data for stream since out of memory"); + return -1; + } + memcpy(data, msg, msgLen); + SSubmitReq* pReq = (SSubmitReq*)data; + pReq->version = ver; + + void* pIter = NULL; + while (1) { + pIter = taosHashIterate(pTq->pPushMgr, pIter); + if (pIter == NULL) break; + STqPushEntry* pPushEntry = *(STqPushEntry**)pIter; + STqExecHandle* pExec = &pPushEntry->pHandle->execHandle; + qTaskInfo_t task = pExec->task; + SMqDataRsp* pRsp = &pPushEntry->dataRsp; + + // prepare scan mem data + qStreamScanMemData(task, pReq); + + // exec + while (1) { + SSDataBlock* pDataBlock = NULL; + uint64_t ts = 0; + if (qExecTask(task, NULL, &ts) < 0) { + ASSERT(0); + } + + if (pDataBlock == NULL) { + break; + } + + tqAddBlockDataToRsp(pDataBlock, pRsp, pExec->numOfCols); + pRsp->blockNum++; + } + if (pRsp->blockNum > 0) { + // set offset + tqOffsetResetToLog(&pRsp->rspOffset, ver); + // remove from hash + size_t kLen; + void* key = taosHashGetKey(pPushEntry, &kLen); + void* keyCopy = taosMemoryMalloc(kLen); + memcpy(keyCopy, key, kLen); + + taosArrayPush(cachedKeys, &keyCopy); + taosArrayPush(cachedKeyLens, &kLen); + + if (taosHashRemove(pTq->pPushMgr, key, kLen) != 0) { + ASSERT(0); + } + tqPushDataRsp(pTq, pPushEntry); + } + } + // delete entry + for (int32_t i = 0; i < taosArrayGetSize(cachedKeys); i++) { + void* key = taosArrayGetP(cachedKeys, i); + size_t kLen = *(size_t*)taosArrayGet(cachedKeyLens, i); + taosHashRemove(pTq->pPushMgr, key, kLen); + } + taosArrayDestroyP(cachedKeys, (FDelete)taosMemoryFree); + taosArrayDestroy(cachedKeyLens); + } + // unlock + taosWUnLockLatch(&pTq->pushLock); + } + if (vnodeIsRoleLeader(pTq->pVnode)) { if (msgType == TDMT_VND_SUBMIT) { if (taosHashGetSize(pTq->pStreamMeta->pTasks) == 0) return 0; diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index 8e5f328efa..d93a8fe030 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -15,21 +15,20 @@ #include "tq.h" - -bool isValValidForTable(STqHandle* pHandle, SWalCont *pHead){ - if(pHandle->execHandle.subType != TOPIC_SUB_TYPE__TABLE){ +bool isValValidForTable(STqHandle* pHandle, SWalCont* pHead) { + if (pHandle->execHandle.subType != TOPIC_SUB_TYPE__TABLE) { return true; } - int16_t msgType = pHead->msgType; - char* body = pHead->body; - int32_t bodyLen = pHead->bodyLen; + int16_t msgType = pHead->msgType; + char* body = pHead->body; + int32_t bodyLen = pHead->bodyLen; - int64_t tbSuid = pHandle->execHandle.execTb.suid; - int64_t realTbSuid = 0; - SDecoder coder; - void* data = POINTER_SHIFT(body, sizeof(SMsgHead)); - int32_t len = bodyLen - sizeof(SMsgHead); + int64_t tbSuid = pHandle->execHandle.execTb.suid; + int64_t realTbSuid = 0; + SDecoder coder; + void* data = POINTER_SHIFT(body, sizeof(SMsgHead)); + int32_t len = bodyLen - sizeof(SMsgHead); tDecoderInit(&coder, data, len); if (msgType == TDMT_VND_CREATE_STB || msgType == TDMT_VND_ALTER_STB) { @@ -43,38 +42,38 @@ bool isValValidForTable(STqHandle* pHandle, SWalCont *pHead){ if (tDecodeSVDropStbReq(&coder, &req) < 0) { goto end; } - realTbSuid = req.suid; + realTbSuid = req.suid; } else if (msgType == TDMT_VND_CREATE_TABLE) { SVCreateTbBatchReq req = {0}; if (tDecodeSVCreateTbBatchReq(&coder, &req) < 0) { goto end; } - int32_t needRebuild = 0; + int32_t needRebuild = 0; SVCreateTbReq* pCreateReq = NULL; for (int32_t iReq = 0; iReq < req.nReqs; iReq++) { pCreateReq = req.pReqs + iReq; - if(pCreateReq->type == TSDB_CHILD_TABLE && pCreateReq->ctb.suid == tbSuid){ + if (pCreateReq->type == TSDB_CHILD_TABLE && pCreateReq->ctb.suid == tbSuid) { needRebuild++; } } - if(needRebuild == 0){ + if (needRebuild == 0) { // do nothing - }else if(needRebuild == req.nReqs){ + } else if (needRebuild == req.nReqs) { realTbSuid = tbSuid; - }else{ + } else { realTbSuid = tbSuid; SVCreateTbBatchReq reqNew = {0}; reqNew.pArray = taosArrayInit(req.nReqs, sizeof(struct SVCreateTbReq)); for (int32_t iReq = 0; iReq < req.nReqs; iReq++) { pCreateReq = req.pReqs + iReq; - if(pCreateReq->type == TSDB_CHILD_TABLE && pCreateReq->ctb.suid == tbSuid){ + if (pCreateReq->type == TSDB_CHILD_TABLE && pCreateReq->ctb.suid == tbSuid) { reqNew.nReqs++; taosArrayPush(reqNew.pArray, pCreateReq); } } - int tlen; + int tlen; int32_t ret = 0; tEncodeSize(tEncodeSVCreateTbBatchReq, &reqNew, tlen, ret); void* buf = taosMemoryMalloc(tlen); @@ -107,7 +106,7 @@ bool isValValidForTable(STqHandle* pHandle, SWalCont *pHead){ } } } else if (msgType == TDMT_VND_ALTER_TABLE) { - SVAlterTbReq req = {0}; + SVAlterTbReq req = {0}; if (tDecodeSVAlterTbReq(&coder, &req) < 0) { goto end; @@ -129,32 +128,32 @@ bool isValValidForTable(STqHandle* pHandle, SWalCont *pHead){ goto end; } - int32_t needRebuild = 0; + int32_t needRebuild = 0; SVDropTbReq* pDropReq = NULL; for (int32_t iReq = 0; iReq < req.nReqs; iReq++) { pDropReq = req.pReqs + iReq; - if(pDropReq->suid == tbSuid){ + if (pDropReq->suid == tbSuid) { needRebuild++; } } - if(needRebuild == 0){ + if (needRebuild == 0) { // do nothing - }else if(needRebuild == req.nReqs){ + } else if (needRebuild == req.nReqs) { realTbSuid = tbSuid; - }else{ + } else { realTbSuid = tbSuid; SVDropTbBatchReq reqNew = {0}; reqNew.pArray = taosArrayInit(req.nReqs, sizeof(SVDropTbReq)); for (int32_t iReq = 0; iReq < req.nReqs; iReq++) { pDropReq = req.pReqs + iReq; - if(pDropReq->suid == tbSuid){ + if (pDropReq->suid == tbSuid) { reqNew.nReqs++; taosArrayPush(reqNew.pArray, pDropReq); } } - int tlen; + int tlen; int32_t ret = 0; tEncodeSize(tEncodeSVDropTbBatchReq, &reqNew, tlen, ret); void* buf = taosMemoryMalloc(tlen); @@ -177,11 +176,11 @@ bool isValValidForTable(STqHandle* pHandle, SWalCont *pHead){ goto end; } realTbSuid = req.suid; - } else{ + } else { ASSERT(0); } - end: +end: tDecoderClear(&coder); return tbSuid == realTbSuid; } @@ -224,7 +223,7 @@ int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHea code = -1; goto END; } - if(isValValidForTable(pHandle, pHead)){ + if (isValValidForTable(pHandle, pHead)) { *fetchOffset = offset; code = 0; goto END; @@ -241,7 +240,7 @@ int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHea offset++; } } - END: +END: taosThreadMutexUnlock(&pHandle->pWalReader->mutex); return code; } @@ -348,7 +347,7 @@ int32_t tqNextBlock(STqReader* pReader, SFetchRet* ret) { } } -int32_t tqReaderSetDataMsg(STqReader* pReader, SSubmitReq* pMsg, int64_t ver) { +int32_t tqReaderSetDataMsg(STqReader* pReader, const SSubmitReq* pMsg, int64_t ver) { pReader->pMsg = pMsg; if (tInitSubmitMsgIter(pMsg, &pReader->msgIter) < 0) return -1; diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 6e9eba306a..b62a4dfbdc 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -808,7 +808,6 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq SSubmitRsp submitRsp = {0}; SSubmitMsgIter msgIter = {0}; SSubmitBlk *pBlock; - SSubmitRsp rsp = {0}; SVCreateTbReq createTbReq = {0}; SDecoder decoder = {0}; int32_t nRows; @@ -921,7 +920,8 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq } if (taosArrayGetSize(newTbUids) > 0) { - vDebug("vgId:%d, add %d table into query table list in handling submit", TD_VID(pVnode), (int32_t)taosArrayGetSize(newTbUids)); + vDebug("vgId:%d, add %d table into query table list in handling submit", TD_VID(pVnode), + (int32_t)taosArrayGetSize(newTbUids)); } tqUpdateTbUidList(pVnode->pTq, newTbUids, true); diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index dc98b05479..f47855c2d0 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -145,6 +145,7 @@ typedef struct { SMqMetaRsp metaRsp; // for tmq fetching meta int8_t returned; int64_t snapshotVer; + const SSubmitReq* pReq; SSchemaWrapper* schema; char tbName[TSDB_TABLE_NAME_LEN]; diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c index 373cb451f4..4db9338bd9 100644 --- a/source/libs/executor/src/executor.c +++ b/source/libs/executor/src/executor.c @@ -486,7 +486,7 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, SL if (pLocal) { memcpy(&pTaskInfo->localFetch, pLocal, sizeof(*pLocal)); } - + taosArrayClearEx(pResList, freeBlock); int64_t curOwner = 0; @@ -773,6 +773,14 @@ int32_t initQueryTableDataCondForTmq(SQueryTableDataCond* pCond, SSnapContext* s return TSDB_CODE_SUCCESS; } +int32_t qStreamScanMemData(qTaskInfo_t tinfo, const SSubmitReq* pReq) { + SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo; + ASSERT(pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE); + ASSERT(pTaskInfo->streamInfo.pReq == NULL); + pTaskInfo->streamInfo.pReq = pReq; + return 0; +} + int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subType) { SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo; SOperatorInfo* pOperator = pTaskInfo->pRoot; diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 6c5c33ae29..5f54d56ca7 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1430,6 +1430,41 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { SStreamScanInfo* pInfo = pOperator->info; qDebug("queue scan called"); + + if (pTaskInfo->streamInfo.pReq != NULL) { + if (pInfo->tqReader->pMsg == NULL) { + pInfo->tqReader->pMsg = pTaskInfo->streamInfo.pReq; + const SSubmitReq* pSubmit = pInfo->tqReader->pMsg; + if (tqReaderSetDataMsg(pInfo->tqReader, pSubmit, 0) < 0) { + qError("submit msg messed up when initing stream submit block %p", pSubmit); + pInfo->tqReader->pMsg = NULL; + ASSERT(0); + } + } + + blockDataCleanup(pInfo->pRes); + SDataBlockInfo* pBlockInfo = &pInfo->pRes->info; + + while (tqNextDataBlock(pInfo->tqReader)) { + SSDataBlock block = {0}; + + int32_t code = tqRetrieveDataBlock(&block, pInfo->tqReader); + + if (code != TSDB_CODE_SUCCESS || block.info.rows == 0) { + continue; + } + + setBlockIntoRes(pInfo, &block); + + if (pBlockInfo->rows > 0) { + return pInfo->pRes; + } + } + + pInfo->tqReader->pMsg = NULL; + pTaskInfo->streamInfo.pReq = NULL; + } + if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA) { SSDataBlock* pResult = doTableScan(pInfo->pTableScanOp); if (pResult && pResult->info.rows > 0) { From a4d426aa13a9b3621e2357e2ca080f5e34d8ab79 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 28 Sep 2022 13:39:48 +0800 Subject: [PATCH 043/143] more fix --- source/dnode/vnode/src/tsdb/tsdbReaderWriter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index 00b6830fbc..167b4a104c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -1069,8 +1069,8 @@ static int32_t tsdbReadBlockDataImpl(SDataFReader *pReader, SBlockInfo *pBlkInfo ASSERT(hdr.delimiter == TSDB_FILE_DLMT); ASSERT(pBlockData->suid == hdr.suid); - ASSERT(pBlockData->uid == hdr.uid); + pBlockData->uid = hdr.uid; pBlockData->nRow = hdr.nRow; // uid From 5be361ee087dfee67ed8645a4017ddd569827357 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 28 Sep 2022 14:01:34 +0800 Subject: [PATCH 044/143] more fix --- source/util/src/tcompression.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index dc473922d7..7d1c6b02ad 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1400,7 +1400,7 @@ static int32_t tCompIntSwitchToCopy(SCompressor *pCmprsor) { int32_t n = 1; int32_t nBuf = 1; int64_t vPrev = 0; - for (int32_t iVal = 0; iVal < pCmprsor->nVal;) { + while (n < pCmprsor->nBuf) { uint64_t b; memcpy(&b, pCmprsor->pBuf + n, sizeof(b)); n += sizeof(b); @@ -1410,14 +1410,18 @@ static int32_t tCompIntSwitchToCopy(SCompressor *pCmprsor) { uint8_t bits = BIT_PER_INTEGER[i_selector]; for (int32_t iEle = 0; iEle < nEle; iEle++) { uint64_t vZigzag = (b >> (bits * iEle + 4)) & (((uint64_t)1 << bits) - 1); - int64_t diff = ZIGZAG_DECODE(int64_t, vZigzag); - vPrev = diff + vPrev; + vPrev = ZIGZAG_DECODE(int64_t, vZigzag) + vPrev; memcpy(pCmprsor->aBuf[0] + nBuf, &vPrev, DATA_TYPE_INFO[pCmprsor->type].bytes); nBuf += DATA_TYPE_INFO[pCmprsor->type].bytes; } - iVal += nEle; - ASSERT(iVal <= pCmprsor->nVal); + } + + for (; pCmprsor->i_start != pCmprsor->i_end; pCmprsor->i_start = (pCmprsor->i_start + 1) % 241) { + vPrev = ZIGZAG_DECODE(int64_t, pCmprsor->i_aZigzag[pCmprsor->i_start]) + vPrev; + + memcpy(pCmprsor->aBuf[0] + nBuf, &vPrev, DATA_TYPE_INFO[pCmprsor->type].bytes); + nBuf += DATA_TYPE_INFO[pCmprsor->type].bytes; } ASSERT(n == pCmprsor->nBuf && nBuf == size); From 01c94a775b6779e501454cddef459cc958c12a62 Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Wed, 28 Sep 2022 14:17:26 +0800 Subject: [PATCH 045/143] feat(tmq): push optimization --- source/client/src/clientTmq.c | 18 +++++++++--------- source/dnode/mnode/impl/src/mndConsumer.c | 1 + source/dnode/mnode/impl/src/mndTopic.c | 2 ++ source/dnode/vnode/src/tq/tq.c | 8 +++++++- source/dnode/vnode/src/tq/tqPush.c | 12 ++++++------ source/libs/executor/src/projectoperator.c | 10 +++++++--- source/libs/executor/src/scanoperator.c | 2 ++ 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/source/client/src/clientTmq.c b/source/client/src/clientTmq.c index c9c02a77e1..e0f48a4534 100644 --- a/source/client/src/clientTmq.c +++ b/source/client/src/clientTmq.c @@ -515,7 +515,7 @@ int32_t tmqCommitMsgImpl(tmq_t* tmq, const TAOS_RES* msg, int8_t async, tmq_comm SMqMetaRspObj* pMetaRspObj = (SMqMetaRspObj*)msg; topic = pMetaRspObj->topic; vgId = pMetaRspObj->vgId; - } else if(TD_RES_TMQ_METADATA(msg)) { + } else if (TD_RES_TMQ_METADATA(msg)) { SMqTaosxRspObj* pRspObj = (SMqTaosxRspObj*)msg; topic = pRspObj->topic; vgId = pRspObj->vgId; @@ -715,7 +715,7 @@ void tmqSendHbReq(void* param, void* tmrId) { int32_t epoch = tmq->epoch; SMqHbReq* pReq = taosMemoryMalloc(sizeof(SMqHbReq)); if (pReq == NULL) goto OVER; - pReq->consumerId = consumerId; + pReq->consumerId = htobe64(consumerId); pReq->epoch = epoch; SMsgSendInfo* sendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo)); @@ -1661,9 +1661,9 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) { // build rsp void* pRsp = NULL; - if(pollRspWrapper->taosxRsp.createTableNum == 0){ + if (pollRspWrapper->taosxRsp.createTableNum == 0) { pRsp = tmqBuildRspFromWrapper(pollRspWrapper); - }else{ + } else { pRsp = tmqBuildTaosxRspFromWrapper(pollRspWrapper); } taosFreeQitem(pollRspWrapper); @@ -1850,12 +1850,12 @@ const char* tmq_get_table_name(TAOS_RES* res) { return (const char*)taosArrayGetP(pRspObj->rsp.blockTbName, pRspObj->resIter); } else if (TD_RES_TMQ_METADATA(res)) { SMqTaosxRspObj* pRspObj = (SMqTaosxRspObj*)res; - if (!pRspObj->rsp.withTbName || pRspObj->rsp.blockTbName == NULL || pRspObj->resIter < 0 || - pRspObj->resIter >= pRspObj->rsp.blockNum) { - return NULL; - } - return (const char*)taosArrayGetP(pRspObj->rsp.blockTbName, pRspObj->resIter); + if (!pRspObj->rsp.withTbName || pRspObj->rsp.blockTbName == NULL || pRspObj->resIter < 0 || + pRspObj->resIter >= pRspObj->rsp.blockNum) { + return NULL; } + return (const char*)taosArrayGetP(pRspObj->rsp.blockTbName, pRspObj->resIter); + } return NULL; } diff --git a/source/dnode/mnode/impl/src/mndConsumer.c b/source/dnode/mnode/impl/src/mndConsumer.c index abc23e3d95..3dfc10e554 100644 --- a/source/dnode/mnode/impl/src/mndConsumer.c +++ b/source/dnode/mnode/impl/src/mndConsumer.c @@ -272,6 +272,7 @@ static int32_t mndProcessMqHbReq(SRpcMsg *pMsg) { SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, consumerId); if (pConsumer == NULL) { + mError("consumer %ld not exist", consumerId); terrno = TSDB_CODE_MND_CONSUMER_NOT_EXIST; return -1; } diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index b9647a28fb..7308dc375e 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -379,6 +379,8 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq * topicObj.ast = strdup(pCreate->ast); topicObj.astLen = strlen(pCreate->ast) + 1; + qDebugL("ast %s", topicObj.ast); + SNode *pAst = NULL; if (nodesStringToNode(pCreate->ast, &pAst) != 0) { taosMemoryFree(topicObj.ast); diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 21136405cb..490a313cd4 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -65,6 +65,11 @@ static void destroySTqHandle(void* data) { } } +static void tqPushEntryFree(void* data) { + void* p = *(void**)data; + taosMemoryFree(p); +} + STQ* tqOpen(const char* path, SVnode* pVnode) { STQ* pTq = taosMemoryCalloc(1, sizeof(STQ)); if (pTq == NULL) { @@ -80,7 +85,7 @@ STQ* tqOpen(const char* path, SVnode* pVnode) { taosInitRWLatch(&pTq->pushLock); pTq->pPushMgr = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); - taosHashSetFreeFp(pTq->pPushMgr, taosMemoryFree); + taosHashSetFreeFp(pTq->pPushMgr, tqPushEntryFree); pTq->pCheckInfo = taosHashInit(64, MurmurHash3_32, true, HASH_ENTRY_LOCK); @@ -548,6 +553,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) { if (pPushEntry != NULL) { pPushEntry->pHandle = pHandle; pPushEntry->pInfo = pMsg->info; + dataRsp.withTbName = 0; memcpy(&pPushEntry->dataRsp, &dataRsp, sizeof(SMqDataRsp)); pPushEntry->rspHead.consumerId = consumerId; pPushEntry->rspHead.epoch = reqEpoch; diff --git a/source/dnode/vnode/src/tq/tqPush.c b/source/dnode/vnode/src/tq/tqPush.c index c42cfeb7b8..13ed36e2bc 100644 --- a/source/dnode/vnode/src/tq/tqPush.c +++ b/source/dnode/vnode/src/tq/tqPush.c @@ -245,7 +245,7 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) while (1) { SSDataBlock* pDataBlock = NULL; uint64_t ts = 0; - if (qExecTask(task, NULL, &ts) < 0) { + if (qExecTask(task, &pDataBlock, &ts) < 0) { ASSERT(0); } @@ -256,21 +256,19 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) tqAddBlockDataToRsp(pDataBlock, pRsp, pExec->numOfCols); pRsp->blockNum++; } + if (pRsp->blockNum > 0) { // set offset tqOffsetResetToLog(&pRsp->rspOffset, ver); // remove from hash size_t kLen; - void* key = taosHashGetKey(pPushEntry, &kLen); + void* key = taosHashGetKey(pIter, &kLen); void* keyCopy = taosMemoryMalloc(kLen); memcpy(keyCopy, key, kLen); taosArrayPush(cachedKeys, &keyCopy); taosArrayPush(cachedKeyLens, &kLen); - if (taosHashRemove(pTq->pPushMgr, key, kLen) != 0) { - ASSERT(0); - } tqPushDataRsp(pTq, pPushEntry); } } @@ -278,7 +276,9 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) for (int32_t i = 0; i < taosArrayGetSize(cachedKeys); i++) { void* key = taosArrayGetP(cachedKeys, i); size_t kLen = *(size_t*)taosArrayGet(cachedKeyLens, i); - taosHashRemove(pTq->pPushMgr, key, kLen); + if (taosHashRemove(pTq->pPushMgr, key, kLen) != 0) { + ASSERT(0); + } } taosArrayDestroyP(cachedKeys, (FDelete)taosMemoryFree); taosArrayDestroy(cachedKeyLens); diff --git a/source/libs/executor/src/projectoperator.c b/source/libs/executor/src/projectoperator.c index 2f12a0d19b..b7c5b5634e 100644 --- a/source/libs/executor/src/projectoperator.c +++ b/source/libs/executor/src/projectoperator.c @@ -53,7 +53,7 @@ static void destroyIndefinitOperatorInfo(void* param) { SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhysiNode* pProjPhyNode, SExecTaskInfo* pTaskInfo) { - int32_t code = TSDB_CODE_SUCCESS; + int32_t code = TSDB_CODE_SUCCESS; SProjectOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SProjectOperatorInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); if (pInfo == NULL || pOperator == NULL) { @@ -184,7 +184,7 @@ static int32_t doIngroupLimitOffset(SLimitInfo* pLimitInfo, uint64_t groupId, SS if (pLimitInfo->limit.limit >= 0 && pLimitInfo->numOfOutputRows + pBlock->info.rows >= pLimitInfo->limit.limit) { int32_t keepRows = (int32_t)(pLimitInfo->limit.limit - pLimitInfo->numOfOutputRows); blockDataKeepFirstNRows(pBlock, keepRows); - //TODO: optimize it later when partition by + limit + // TODO: optimize it later when partition by + limit if ((pLimitInfo->slimit.limit == -1 && pLimitInfo->currentGroupId == 0) || (pLimitInfo->slimit.limit > 0 && pLimitInfo->slimit.limit <= pLimitInfo->numOfOutputGroups)) { doSetOperatorCompleted(pOperator); @@ -206,6 +206,10 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) { blockDataCleanup(pFinalRes); SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + if (pTaskInfo->streamInfo.pReq) { + pOperator->status = OP_OPENED; + } + if (pOperator->status == OP_EXEC_DONE) { if (pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE) { pOperator->status = OP_OPENED; @@ -254,7 +258,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) { } setInfoForNewGroup(pBlock, pLimitInfo, pOperator); - if (pOperator->status == OP_EXEC_DONE) { + if (pTaskInfo->execModel == OPTR_EXEC_MODEL_BATCH && pOperator->status == OP_EXEC_DONE) { break; } diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index fa05608ced..46280295b9 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1443,6 +1443,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { if (tqReaderSetDataMsg(pInfo->tqReader, pSubmit, 0) < 0) { qError("submit msg messed up when initing stream submit block %p", pSubmit); pInfo->tqReader->pMsg = NULL; + pTaskInfo->streamInfo.pReq = NULL; ASSERT(0); } } @@ -1468,6 +1469,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { pInfo->tqReader->pMsg = NULL; pTaskInfo->streamInfo.pReq = NULL; + return NULL; } if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA) { From 0ca19fb42bd2a072eaed048060c203104b8f7245 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 28 Sep 2022 15:46:56 +0800 Subject: [PATCH 046/143] fix more --- source/util/src/tcompression.c | 74 ++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 7d1c6b02ad..a6167a1a75 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1024,6 +1024,11 @@ static int32_t tCompTimestampEnd(SCompressor *pCmprsor, const uint8_t **ppData, static int32_t tCompBinaryStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg); static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nData); static int32_t tCompBinaryEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); + +static FORCE_INLINE int64_t tI8ToI64(const void *pData) { return *(int8_t *)pData; } +static FORCE_INLINE int64_t tI16ToI64(const void *pData) { return *(int16_t *)pData; } +static FORCE_INLINE int64_t tI32ToI64(const void *pData) { return *(int32_t *)pData; } +static FORCE_INLINE int64_t tI64ToI64(const void *pData) { return *(int64_t *)pData; } static struct { int8_t type; int32_t bytes; @@ -1031,122 +1036,148 @@ static struct { int32_t (*startFn)(SCompressor *, int8_t type, int8_t cmprAlg); int32_t (*cmprFn)(SCompressor *, const void *, int32_t nData); int32_t (*endFn)(SCompressor *, const uint8_t **, int32_t *); + int64_t (*getI64)(const void *pData); } DATA_TYPE_INFO[] = { - {.type = TSDB_DATA_TYPE_NULL, .bytes = 0, .isVarLen = 0, .startFn = NULL, .cmprFn = NULL, .endFn = NULL}, + {.type = TSDB_DATA_TYPE_NULL, + .bytes = 0, + .isVarLen = 0, + .startFn = NULL, + .cmprFn = NULL, + .endFn = NULL, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_BOOL, .bytes = 1, .isVarLen = 0, .startFn = tCompBoolStart, .cmprFn = tCompBool, - .endFn = tCompBoolEnd}, + .endFn = tCompBoolEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_TINYINT, .bytes = 1, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI8ToI64}, {.type = TSDB_DATA_TYPE_SMALLINT, .bytes = 2, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI16ToI64}, {.type = TSDB_DATA_TYPE_INT, .bytes = 4, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI32ToI64}, {.type = TSDB_DATA_TYPE_BIGINT, .bytes = 8, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI64ToI64}, {.type = TSDB_DATA_TYPE_FLOAT, .bytes = 4, .isVarLen = 0, .startFn = tCompFloatStart, .cmprFn = tCompFloat, - .endFn = tCompFloatEnd}, + .endFn = tCompFloatEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_DOUBLE, .bytes = 8, .isVarLen = 0, .startFn = tCompDoubleStart, .cmprFn = tCompDouble, - .endFn = tCompDoubleEnd}, + .endFn = tCompDoubleEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_VARCHAR, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_TIMESTAMP, .bytes = 8, .isVarLen = 0, .startFn = tCompTimestampStart, .cmprFn = tCompTimestamp, - .endFn = tCompTimestampEnd}, + .endFn = tCompTimestampEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_NCHAR, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_UTINYINT, .bytes = 1, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI8ToI64}, {.type = TSDB_DATA_TYPE_USMALLINT, .bytes = 2, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI16ToI64}, {.type = TSDB_DATA_TYPE_UINT, .bytes = 4, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI32ToI64}, {.type = TSDB_DATA_TYPE_UBIGINT, .bytes = 8, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, - .endFn = tCompIntEnd}, + .endFn = tCompIntEnd, + .getI64 = tI64ToI64}, {.type = TSDB_DATA_TYPE_JSON, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_VARBINARY, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_DECIMAL, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_BLOB, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, {.type = TSDB_DATA_TYPE_MEDIUMBLOB, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, - .endFn = tCompBinaryEnd}, + .endFn = tCompBinaryEnd, + .getI64 = NULL}, }; struct SCompressor { @@ -1442,8 +1473,7 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) ASSERT(nData == DATA_TYPE_INFO[pCmprsor->type].bytes); if (pCmprsor->pBuf[0] == 0) { - int64_t val = 0; - memcpy(&val, pData, nData); // little-endian only + int64_t val = DATA_TYPE_INFO[pCmprsor->type].getI64(pData); if (!I64_SAFE_ADD(val, -pCmprsor->i_prev)) { code = tCompIntSwitchToCopy(pCmprsor); From 99bc329384916e0597c2ec743a7b904b0b83ff13 Mon Sep 17 00:00:00 2001 From: slzhou Date: Wed, 28 Sep 2022 16:30:40 +0800 Subject: [PATCH 047/143] enhance: optimize select from ins_tags where table_name='tablename' without iterating through meta tdb --- source/dnode/vnode/inc/vnode.h | 1 + source/dnode/vnode/src/inc/vnodeInt.h | 1 - source/libs/executor/src/scanoperator.c | 290 +++++++++++++++--------- 3 files changed, 184 insertions(+), 108 deletions(-) diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 6ba10641f5..69b3652b50 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -92,6 +92,7 @@ typedef struct SMetaEntry SMetaEntry; void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags); void metaReaderClear(SMetaReader *pReader); int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid); +int metaGetTableEntryByName(SMetaReader *pReader, const char *name); int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags); int32_t metaReadNext(SMetaReader *pReader); const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal); diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 4c8045d651..079efd7097 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -110,7 +110,6 @@ int metaAlterTable(SMeta* pMeta, int64_t version, SVAlterTbReq* pReq SSchemaWrapper* metaGetTableSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, bool isinline); STSchema* metaGetTbTSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver); int32_t metaGetTbTSchemaEx(SMeta* pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sver, STSchema** ppTSchema); -int metaGetTableEntryByName(SMetaReader* pReader, const char* name); tb_uid_t metaGetTableEntryUidByName(SMeta* pMeta, const char* name); int64_t metaGetTbNum(SMeta* pMeta); int64_t metaGetTimeSeriesNum(SMeta* pMeta); diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 6c5c33ae29..de3e66bf65 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -41,7 +41,12 @@ static int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const S static bool processBlockWithProbability(const SSampleExecInfo* pInfo); -bool processBlockWithProbability(const SSampleExecInfo* pInfo) { +static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smr, const char* dbname, + const char* tableName, int32_t* pNumOfRows, + const SSDataBlock* dataBlock); + +static void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock); +bool processBlockWithProbability(const SSampleExecInfo* pInfo) { #if 0 if (pInfo->sampleRatio == 1) { return true; @@ -2330,6 +2335,47 @@ int32_t convertTagDataToStr(char* str, int type, void* buf, int32_t bufSize, int return TSDB_CODE_SUCCESS; } +static bool sysTableIsOperatorCondOnOneTable(SNode* pCond, char* condTable) { + SOperatorNode* node = (SOperatorNode*)pCond; + if (node->opType == OP_TYPE_EQUAL) { + if (nodeType(node->pLeft) == QUERY_NODE_COLUMN && + strcasecmp(nodesGetNameFromColumnNode(node->pLeft), "table_name") == 0 && + nodeType(node->pRight) == QUERY_NODE_VALUE) { + SValueNode* pValue = (SValueNode*)node->pRight; + if (pValue->node.type == TSDB_DATA_TYPE_NCHAR || pValue->node.type == TSDB_DATA_TYPE_VARCHAR || + pValue->node.type == TSDB_DATA_TYPE_BINARY) { + char* value = nodesGetStrValueFromNode(pValue); + strncpy(condTable, value, TSDB_TABLE_NAME_LEN); + taosMemoryFree(value); + return true; + } + } + } + return false; +} + +static bool sysTableIsCondOnOneTable(SNode* pCond, char* condTable) { + if (nodeType(pCond) == QUERY_NODE_LOGIC_CONDITION) { + SLogicConditionNode* node = (SLogicConditionNode*)pCond; + if (LOGIC_COND_TYPE_AND == node->condType) { + SListCell* cell = node->pParameterList->pHead; + for (int32_t i = 0; i < node->pParameterList->length; ++i) { + SNode* pChild = cell->pNode; + if (QUERY_NODE_OPERATOR == nodeType(pChild)) { + if (sysTableIsOperatorCondOnOneTable(pChild, condTable)) { + return true; + } + } + cell = cell->pNext; + } + } + } + if (QUERY_NODE_OPERATOR == nodeType(pCond)) { + return sysTableIsOperatorCondOnOneTable(pCond, condTable); + } + return false; +} + static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SSysTableScanInfo* pInfo = pOperator->info; @@ -2337,13 +2383,12 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { return NULL; } - if (pInfo->pCur == NULL) { - pInfo->pCur = metaOpenTbCursor(pInfo->readHandle.meta); - } - blockDataCleanup(pInfo->pRes); int32_t numOfRows = 0; + SSDataBlock* dataBlock = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TAGS); + blockDataEnsureCapacity(dataBlock, pOperator->resultInfo.capacity); + const char* db = NULL; int32_t vgId = 0; vnodeGetInfo(pInfo->readHandle.vnode, &db, &vgId); @@ -2355,10 +2400,32 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { tNameGetDbName(&sn, varDataVal(dbname)); varDataSetLen(dbname, strlen(varDataVal(dbname))); - SSDataBlock* p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TAGS); - blockDataEnsureCapacity(p, pOperator->resultInfo.capacity); + char condTableName[TSDB_TABLE_NAME_LEN] = {0}; + // optimize when sql like where table_name='tablename' and xxx. + if (sysTableIsCondOnOneTable(pInfo->pCondition, condTableName)) { + char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_TO_VARSTR(tableName, condTableName); + + SMetaReader smr = {0}; + metaReaderInit(&smr, pInfo->readHandle.meta, 0); + metaGetTableEntryByName(&smr, condTableName); + sysTableUserTagsFillOneTableTags(pInfo, &smr, dbname, tableName, &numOfRows, dataBlock); + metaReaderClear(&smr); + if (numOfRows > 0) { + relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock); + numOfRows = 0; + } + blockDataDestroy(dataBlock); + + pInfo->loadInfo.totalRows += pInfo->pRes->info.rows; + return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes; + } int32_t ret = 0; + if (pInfo->pCur == NULL) { + pInfo->pCur = metaOpenTbCursor(pInfo->readHandle.meta); + } + while ((ret = metaTbCursorNext(pInfo->pCur)) == 0) { if (pInfo->pCur->mr.me.type != TSDB_CHILD_TABLE) { continue; @@ -2381,100 +2448,12 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { T_LONG_JMP(pTaskInfo->env, terrno); } - char stableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(stableName, smr.me.name); + sysTableUserTagsFillOneTableTags(pInfo, &smr, dbname, tableName, &numOfRows, dataBlock); - int32_t numOfTags = smr.me.stbEntry.schemaTag.nCols; - for (int32_t i = 0; i < numOfTags; ++i) { - SColumnInfoData* pColInfoData = NULL; - - // table name - pColInfoData = taosArrayGet(p->pDataBlock, 0); - colDataAppend(pColInfoData, numOfRows, tableName, false); - - // database name - pColInfoData = taosArrayGet(p->pDataBlock, 1); - colDataAppend(pColInfoData, numOfRows, dbname, false); - - // super table name - pColInfoData = taosArrayGet(p->pDataBlock, 2); - colDataAppend(pColInfoData, numOfRows, stableName, false); - - // tag name - char tagName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(tagName, smr.me.stbEntry.schemaTag.pSchema[i].name); - pColInfoData = taosArrayGet(p->pDataBlock, 3); - colDataAppend(pColInfoData, numOfRows, tagName, false); - - // tag type - int8_t tagType = smr.me.stbEntry.schemaTag.pSchema[i].type; - pColInfoData = taosArrayGet(p->pDataBlock, 4); - char tagTypeStr[VARSTR_HEADER_SIZE + 32]; - int tagTypeLen = sprintf(varDataVal(tagTypeStr), "%s", tDataTypes[tagType].name); - if (tagType == TSDB_DATA_TYPE_VARCHAR) { - tagTypeLen += sprintf(varDataVal(tagTypeStr) + tagTypeLen, "(%d)", - (int32_t)(smr.me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE)); - } else if (tagType == TSDB_DATA_TYPE_NCHAR) { - tagTypeLen += - sprintf(varDataVal(tagTypeStr) + tagTypeLen, "(%d)", - (int32_t)((smr.me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE)); - } - varDataSetLen(tagTypeStr, tagTypeLen); - colDataAppend(pColInfoData, numOfRows, (char*)tagTypeStr, false); - - STagVal tagVal = {0}; - tagVal.cid = smr.me.stbEntry.schemaTag.pSchema[i].colId; - char* tagData = NULL; - uint32_t tagLen = 0; - - if (tagType == TSDB_DATA_TYPE_JSON) { - tagData = (char*)pInfo->pCur->mr.me.ctbEntry.pTags; - } else { - bool exist = tTagGet((STag*)pInfo->pCur->mr.me.ctbEntry.pTags, &tagVal); - if (exist) { - if (IS_VAR_DATA_TYPE(tagType)) { - tagData = (char*)tagVal.pData; - tagLen = tagVal.nData; - } else { - tagData = (char*)&tagVal.i64; - tagLen = tDataTypes[tagType].bytes; - } - } - } - - char* tagVarChar = NULL; - if (tagData != NULL) { - if (tagType == TSDB_DATA_TYPE_JSON) { - char* tagJson = parseTagDatatoJson(tagData); - tagVarChar = taosMemoryMalloc(strlen(tagJson) + VARSTR_HEADER_SIZE); - memcpy(varDataVal(tagVarChar), tagJson, strlen(tagJson)); - varDataSetLen(tagVarChar, strlen(tagJson)); - taosMemoryFree(tagJson); - } else { - int32_t bufSize = IS_VAR_DATA_TYPE(tagType) ? (tagLen + VARSTR_HEADER_SIZE) - : (3 + DBL_MANT_DIG - DBL_MIN_EXP + VARSTR_HEADER_SIZE); - tagVarChar = taosMemoryMalloc(bufSize); - int32_t len = -1; - convertTagDataToStr(varDataVal(tagVarChar), tagType, tagData, tagLen, &len); - varDataSetLen(tagVarChar, len); - } - } - pColInfoData = taosArrayGet(p->pDataBlock, 5); - colDataAppend(pColInfoData, numOfRows, tagVarChar, - (tagData == NULL) || (tagType == TSDB_DATA_TYPE_JSON && tTagIsJsonNull(tagData))); - taosMemoryFree(tagVarChar); - ++numOfRows; - } metaReaderClear(&smr); if (numOfRows >= pOperator->resultInfo.capacity) { - p->info.rows = numOfRows; - pInfo->pRes->info.rows = numOfRows; - - relocateColumnData(pInfo->pRes, pInfo->scanCols, p->pDataBlock, false); - doFilterResult(pInfo); - - blockDataCleanup(p); + relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock); numOfRows = 0; if (pInfo->pRes->info.rows > 0) { @@ -2484,19 +2463,11 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { } if (numOfRows > 0) { - p->info.rows = numOfRows; - pInfo->pRes->info.rows = numOfRows; - - relocateColumnData(pInfo->pRes, pInfo->scanCols, p->pDataBlock, false); - doFilterResult(pInfo); - - blockDataCleanup(p); + relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock); numOfRows = 0; } - blockDataDestroy(p); - - // todo temporarily free the cursor here, the true reason why the free is not valid needs to be found + blockDataDestroy(dataBlock); if (ret != 0) { metaCloseTbCursor(pInfo->pCur); pInfo->pCur = NULL; @@ -2507,6 +2478,111 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes; } +static void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock) { + dataBlock->info.rows = numOfRows; + pInfo->pRes->info.rows = numOfRows; + + relocateColumnData(pInfo->pRes, pInfo->scanCols, dataBlock->pDataBlock, false); + doFilterResult(pInfo); + + blockDataCleanup(dataBlock); +} + +static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smr, const char* dbname, + const char* tableName, int32_t* pNumOfRows, + const SSDataBlock* dataBlock) { + char stableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_TO_VARSTR(stableName, (*smr).me.name); + + int32_t numOfRows = *pNumOfRows; + + int32_t numOfTags = (*smr).me.stbEntry.schemaTag.nCols; + for (int32_t i = 0; i < numOfTags; ++i) { + SColumnInfoData* pColInfoData = NULL; + + // table name + pColInfoData = taosArrayGet(dataBlock->pDataBlock, 0); + colDataAppend(pColInfoData, numOfRows, tableName, false); + + // database name + pColInfoData = taosArrayGet(dataBlock->pDataBlock, 1); + colDataAppend(pColInfoData, numOfRows, dbname, false); + + // super table name + pColInfoData = taosArrayGet(dataBlock->pDataBlock, 2); + colDataAppend(pColInfoData, numOfRows, stableName, false); + + // tag name + char tagName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_TO_VARSTR(tagName, (*smr).me.stbEntry.schemaTag.pSchema[i].name); + pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3); + colDataAppend(pColInfoData, numOfRows, tagName, false); + + // tag type + int8_t tagType = (*smr).me.stbEntry.schemaTag.pSchema[i].type; + pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4); + char tagTypeStr[VARSTR_HEADER_SIZE + 32]; + int tagTypeLen = sprintf(varDataVal(tagTypeStr), "%s", tDataTypes[tagType].name); + if (tagType == TSDB_DATA_TYPE_VARCHAR) { + tagTypeLen += sprintf(varDataVal(tagTypeStr) + tagTypeLen, "(%d)", + (int32_t)((*smr).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE)); + } else if (tagType == TSDB_DATA_TYPE_NCHAR) { + tagTypeLen += + sprintf(varDataVal(tagTypeStr) + tagTypeLen, "(%d)", + (int32_t)(((*smr).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE)); + } + varDataSetLen(tagTypeStr, tagTypeLen); + colDataAppend(pColInfoData, numOfRows, (char*)tagTypeStr, false); + + STagVal tagVal = {0}; + tagVal.cid = (*smr).me.stbEntry.schemaTag.pSchema[i].colId; + char* tagData = NULL; + uint32_t tagLen = 0; + + if (tagType == TSDB_DATA_TYPE_JSON) { + tagData = (char*)pInfo->pCur->mr.me.ctbEntry.pTags; + } else { + bool exist = tTagGet((STag*)pInfo->pCur->mr.me.ctbEntry.pTags, &tagVal); + if (exist) { + if (IS_VAR_DATA_TYPE(tagType)) { + tagData = (char*)tagVal.pData; + tagLen = tagVal.nData; + } else { + tagData = (char*)&tagVal.i64; + tagLen = tDataTypes[tagType].bytes; + } + } + } + + char* tagVarChar = NULL; + if (tagData != NULL) { + if (tagType == TSDB_DATA_TYPE_JSON) { + char* tagJson = parseTagDatatoJson(tagData); + tagVarChar = taosMemoryMalloc(strlen(tagJson) + VARSTR_HEADER_SIZE); + memcpy(varDataVal(tagVarChar), tagJson, strlen(tagJson)); + varDataSetLen(tagVarChar, strlen(tagJson)); + taosMemoryFree(tagJson); + } else { + int32_t bufSize = IS_VAR_DATA_TYPE(tagType) ? (tagLen + VARSTR_HEADER_SIZE) + : (3 + DBL_MANT_DIG - DBL_MIN_EXP + VARSTR_HEADER_SIZE); + tagVarChar = taosMemoryMalloc(bufSize); + int32_t len = -1; + convertTagDataToStr(varDataVal(tagVarChar), tagType, tagData, tagLen, &len); + varDataSetLen(tagVarChar, len); + } + } + pColInfoData = taosArrayGet(dataBlock->pDataBlock, 5); + colDataAppend(pColInfoData, numOfRows, tagVarChar, + (tagData == NULL) || (tagType == TSDB_DATA_TYPE_JSON && tTagIsJsonNull(tagData))); + taosMemoryFree(tagVarChar); + ++numOfRows; + } + + *pNumOfRows = numOfRows; + + return TSDB_CODE_SUCCESS; +} + static SSDataBlock* sysTableScanUserTables(SOperatorInfo* pOperator) { SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SSysTableScanInfo* pInfo = pOperator->info; From ed0d08192da06af1491c92a15fe7a40184dcf9d6 Mon Sep 17 00:00:00 2001 From: slzhou Date: Wed, 28 Sep 2022 16:39:06 +0800 Subject: [PATCH 048/143] fix: fix bugs of condition is null --- source/libs/executor/src/scanoperator.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index de3e66bf65..12b9a459f7 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -2355,24 +2355,25 @@ static bool sysTableIsOperatorCondOnOneTable(SNode* pCond, char* condTable) { } static bool sysTableIsCondOnOneTable(SNode* pCond, char* condTable) { + if (pCond == NULL) { + return false; + } if (nodeType(pCond) == QUERY_NODE_LOGIC_CONDITION) { SLogicConditionNode* node = (SLogicConditionNode*)pCond; if (LOGIC_COND_TYPE_AND == node->condType) { - SListCell* cell = node->pParameterList->pHead; - for (int32_t i = 0; i < node->pParameterList->length; ++i) { - SNode* pChild = cell->pNode; - if (QUERY_NODE_OPERATOR == nodeType(pChild)) { - if (sysTableIsOperatorCondOnOneTable(pChild, condTable)) { - return true; - } + SNode* pChild = NULL; + FOREACH(pChild, node->pParameterList) { + if (QUERY_NODE_OPERATOR == nodeType(pChild) && sysTableIsOperatorCondOnOneTable(pChild, condTable)) { + return true; } - cell = cell->pNext; } } } + if (QUERY_NODE_OPERATOR == nodeType(pCond)) { return sysTableIsOperatorCondOnOneTable(pCond, condTable); } + return false; } @@ -2401,8 +2402,8 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { varDataSetLen(dbname, strlen(varDataVal(dbname))); char condTableName[TSDB_TABLE_NAME_LEN] = {0}; - // optimize when sql like where table_name='tablename' and xxx. - if (sysTableIsCondOnOneTable(pInfo->pCondition, condTableName)) { + // optimize when sql like where table_name='tablename' and xxx. + if (pInfo->pCondition && sysTableIsCondOnOneTable(pInfo->pCondition, condTableName)) { char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; STR_TO_VARSTR(tableName, condTableName); From 82a227b9c74ad0ec7bac2cb59fe1f68d5cfccbd3 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 28 Sep 2022 18:48:35 +0800 Subject: [PATCH 049/143] more fix --- include/util/tcoding.h | 6 +- source/util/src/tcompression.c | 117 ++++++++++++++++++++++++--------- 2 files changed, 89 insertions(+), 34 deletions(-) diff --git a/include/util/tcoding.h b/include/util/tcoding.h index 5962949a70..38eb0d8fc6 100644 --- a/include/util/tcoding.h +++ b/include/util/tcoding.h @@ -23,8 +23,8 @@ extern "C" { #endif #define ENCODE_LIMIT (((uint8_t)1) << 7) -#define ZIGZAGE(T, v) ((u##T)((v) >> (sizeof(T) * 8 - 1))) ^ (((u##T)(v)) << 1) // zigzag encode -#define ZIGZAGD(T, v) ((v) >> 1) ^ -((T)((v)&1)) // zigzag decode +#define ZIGZAGE(T, v) (((u##T)((v) >> (sizeof(T) * 8 - 1))) ^ (((u##T)(v)) << 1)) // zigzag encode +#define ZIGZAGD(T, v) (((v) >> 1) ^ -((T)((v)&1))) // zigzag decode /* ------------------------ LEGACY CODES ------------------------ */ #if 1 @@ -70,7 +70,7 @@ static FORCE_INLINE int32_t taosEncodeFixedBool(void **buf, bool value) { } static FORCE_INLINE void *taosDecodeFixedBool(const void *buf, bool *value) { - *value = ( (((int8_t *)buf)[0] == 0) ? false : true ); + *value = ((((int8_t *)buf)[0] == 0) ? false : true); return POINTER_SHIFT(buf, sizeof(int8_t)); } diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index a6167a1a75..9cac1fb957 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -62,8 +62,8 @@ static const int32_t TEST_NUMBER = 1; #define SIMPLE8B_MAX_INT64 ((uint64_t)1152921504606846974LL) #define safeInt64Add(a, b) (((a >= 0) && (b <= INT64_MAX - a)) || ((a < 0) && (b >= INT64_MIN - a))) -#define ZIGZAG_ENCODE(T, v) ((u##T)((v) >> (sizeof(T) * 8 - 1))) ^ (((u##T)(v)) << 1) // zigzag encode -#define ZIGZAG_DECODE(T, v) ((v) >> 1) ^ -((T)((v)&1)) // zigzag decode +#define ZIGZAG_ENCODE(T, v) (((u##T)((v) >> (sizeof(T) * 8 - 1))) ^ (((u##T)(v)) << 1)) // zigzag encode +#define ZIGZAG_DECODE(T, v) (((v) >> 1) ^ -((T)((v)&1))) // zigzag decode #ifdef TD_TSZ bool lossyFloat = false; @@ -1025,10 +1025,16 @@ static int32_t tCompBinaryStart(SCompressor *pCmprsor, int8_t type, int8_t cmprA static int32_t tCompBinary(SCompressor *pCmprsor, const void *pData, int32_t nData); static int32_t tCompBinaryEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData); -static FORCE_INLINE int64_t tI8ToI64(const void *pData) { return *(int8_t *)pData; } -static FORCE_INLINE int64_t tI16ToI64(const void *pData) { return *(int16_t *)pData; } -static FORCE_INLINE int64_t tI32ToI64(const void *pData) { return *(int32_t *)pData; } -static FORCE_INLINE int64_t tI64ToI64(const void *pData) { return *(int64_t *)pData; } +static FORCE_INLINE int64_t tGetI64OfI8(const void *pData) { return *(int8_t *)pData; } +static FORCE_INLINE int64_t tGetI64OfI16(const void *pData) { return *(int16_t *)pData; } +static FORCE_INLINE int64_t tGetI64OfI32(const void *pData) { return *(int32_t *)pData; } +static FORCE_INLINE int64_t tGetI64OfI64(const void *pData) { return *(int64_t *)pData; } + +static FORCE_INLINE void tPutI64OfI8(int64_t v, void *pData) { *(int8_t *)pData = v; } +static FORCE_INLINE void tPutI64OfI16(int64_t v, void *pData) { *(int16_t *)pData = v; } +static FORCE_INLINE void tPutI64OfI32(int64_t v, void *pData) { *(int32_t *)pData = v; } +static FORCE_INLINE void tPutI64OfI64(int64_t v, void *pData) { *(int64_t *)pData = v; } + static struct { int8_t type; int32_t bytes; @@ -1037,6 +1043,7 @@ static struct { int32_t (*cmprFn)(SCompressor *, const void *, int32_t nData); int32_t (*endFn)(SCompressor *, const uint8_t **, int32_t *); int64_t (*getI64)(const void *pData); + void (*putI64)(int64_t v, void *pData); } DATA_TYPE_INFO[] = { {.type = TSDB_DATA_TYPE_NULL, .bytes = 0, @@ -1044,140 +1051,160 @@ static struct { .startFn = NULL, .cmprFn = NULL, .endFn = NULL, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_BOOL, .bytes = 1, .isVarLen = 0, .startFn = tCompBoolStart, .cmprFn = tCompBool, .endFn = tCompBoolEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_TINYINT, .bytes = 1, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, .endFn = tCompIntEnd, - .getI64 = tI8ToI64}, + .getI64 = tGetI64OfI8, + .putI64 = tPutI64OfI8}, {.type = TSDB_DATA_TYPE_SMALLINT, .bytes = 2, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, .endFn = tCompIntEnd, - .getI64 = tI16ToI64}, + .getI64 = tGetI64OfI16, + .putI64 = tPutI64OfI16}, {.type = TSDB_DATA_TYPE_INT, .bytes = 4, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, .endFn = tCompIntEnd, - .getI64 = tI32ToI64}, + .getI64 = tGetI64OfI32, + .putI64 = tPutI64OfI32}, {.type = TSDB_DATA_TYPE_BIGINT, .bytes = 8, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, .endFn = tCompIntEnd, - .getI64 = tI64ToI64}, + .getI64 = tGetI64OfI64, + .putI64 = tPutI64OfI64}, {.type = TSDB_DATA_TYPE_FLOAT, .bytes = 4, .isVarLen = 0, .startFn = tCompFloatStart, .cmprFn = tCompFloat, .endFn = tCompFloatEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_DOUBLE, .bytes = 8, .isVarLen = 0, .startFn = tCompDoubleStart, .cmprFn = tCompDouble, .endFn = tCompDoubleEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_VARCHAR, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, .endFn = tCompBinaryEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_TIMESTAMP, .bytes = 8, .isVarLen = 0, .startFn = tCompTimestampStart, .cmprFn = tCompTimestamp, .endFn = tCompTimestampEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_NCHAR, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, .endFn = tCompBinaryEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_UTINYINT, .bytes = 1, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, .endFn = tCompIntEnd, - .getI64 = tI8ToI64}, + .getI64 = tGetI64OfI8, + .putI64 = tPutI64OfI8}, {.type = TSDB_DATA_TYPE_USMALLINT, .bytes = 2, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, .endFn = tCompIntEnd, - .getI64 = tI16ToI64}, + .getI64 = tGetI64OfI16, + .putI64 = tPutI64OfI16}, {.type = TSDB_DATA_TYPE_UINT, .bytes = 4, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, .endFn = tCompIntEnd, - .getI64 = tI32ToI64}, + .getI64 = tGetI64OfI32, + .putI64 = tPutI64OfI32}, {.type = TSDB_DATA_TYPE_UBIGINT, .bytes = 8, .isVarLen = 0, .startFn = tCompIntStart, .cmprFn = tCompInt, .endFn = tCompIntEnd, - .getI64 = tI64ToI64}, + .getI64 = tGetI64OfI64, + .putI64 = tPutI64OfI64}, {.type = TSDB_DATA_TYPE_JSON, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, .endFn = tCompBinaryEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_VARBINARY, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, .endFn = tCompBinaryEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_DECIMAL, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, .endFn = tCompBinaryEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_BLOB, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, .endFn = tCompBinaryEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, {.type = TSDB_DATA_TYPE_MEDIUMBLOB, .bytes = 1, .isVarLen = 1, .startFn = tCompBinaryStart, .cmprFn = tCompBinary, .endFn = tCompBinaryEnd, - .getI64 = NULL}, + .getI64 = NULL, + .putI64 = NULL}, }; struct SCompressor { @@ -1443,7 +1470,7 @@ static int32_t tCompIntSwitchToCopy(SCompressor *pCmprsor) { uint64_t vZigzag = (b >> (bits * iEle + 4)) & (((uint64_t)1 << bits) - 1); vPrev = ZIGZAG_DECODE(int64_t, vZigzag) + vPrev; - memcpy(pCmprsor->aBuf[0] + nBuf, &vPrev, DATA_TYPE_INFO[pCmprsor->type].bytes); + DATA_TYPE_INFO[pCmprsor->type].putI64(vPrev, pCmprsor->aBuf[0] + nBuf); nBuf += DATA_TYPE_INFO[pCmprsor->type].bytes; } } @@ -1504,8 +1531,22 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) pCmprsor->i_end = (pCmprsor->i_end + 1) % 241; break; } else { - while (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { - pCmprsor->i_selector++; + if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + int32_t lidx = pCmprsor->i_selector + 1; + int32_t ridx = 15; + while (lidx <= ridx) { + pCmprsor->i_selector = (lidx + ridx) >> 1; + + if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + lidx = pCmprsor->i_selector + 1; + } else if (nEle > SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + ridx = pCmprsor->i_selector - 1; + } else { + break; + } + } + + if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) pCmprsor->i_selector++; } nEle = SELECTOR_TO_ELEMS[pCmprsor->i_selector]; @@ -1551,8 +1592,22 @@ static int32_t tCompIntEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_ int32_t nEle = (pCmprsor->i_end + 241 - pCmprsor->i_start) % 241; if (nEle == 0) break; - while (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { - pCmprsor->i_selector++; + if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + int32_t lidx = pCmprsor->i_selector + 1; + int32_t ridx = 15; + while (lidx <= ridx) { + pCmprsor->i_selector = (lidx + ridx) >> 1; + + if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + lidx = pCmprsor->i_selector + 1; + } else if (nEle > SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + ridx = pCmprsor->i_selector - 1; + } else { + break; + } + } + + if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) pCmprsor->i_selector++; } nEle = SELECTOR_TO_ELEMS[pCmprsor->i_selector]; From 45fb658cec54b1c377c31d04fb70f90b98d5b9ee Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Wed, 28 Sep 2022 19:06:43 +0800 Subject: [PATCH 050/143] fix: fix rows missed in query result issue --- source/dnode/vnode/src/tsdb/tsdbRead.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 2ea6a57b9e..c3cb5f9eb8 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -486,7 +486,7 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd pReader->pTsdb = getTsdbByRetentions(pVnode, pCond->twindows.skey, pVnode->config.tsdbCfg.retentions, idstr, &level); pReader->suid = pCond->suid; pReader->order = pCond->order; - pReader->capacity = 4096; + pReader->capacity = capacity; pReader->idStr = (idstr != NULL) ? strdup(idstr) : NULL; pReader->verRange = getQueryVerRange(pVnode, pCond, level); pReader->type = pCond->type; @@ -841,14 +841,18 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn bool asc = ASCENDING_TRAVERSE(pReader->order); int32_t step = asc ? 1 : -1; - if (asc && pReader->window.skey <= pBlock->minKey.ts) { - pDumpInfo->rowIndex = 0; - } else if (!asc && pReader->window.ekey >= pBlock->maxKey.ts) { - pDumpInfo->rowIndex = pBlock->nRow - 1; - } else { - int32_t pos = asc ? pBlock->nRow - 1 : 0; - int32_t order = (pReader->order == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC; - pDumpInfo->rowIndex = doBinarySearchKey(pBlockData->aTSKEY, pBlock->nRow, pos, pReader->window.skey, order); + + if ((pDumpInfo->rowIndex == 0 && asc) || (pDumpInfo->rowIndex == pBlock->nRow - 1 && (!asc))) { + if (asc && pReader->window.skey <= pBlock->minKey.ts) { + //pDumpInfo->rowIndex = 0; + } else + if (!asc && pReader->window.ekey >= pBlock->maxKey.ts) { + //pDumpInfo->rowIndex = pBlock->nRow - 1; + } else { + int32_t pos = asc ? pBlock->nRow - 1 : 0; + int32_t order = (pReader->order == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC; + pDumpInfo->rowIndex = doBinarySearchKey(pBlockData->aTSKEY, pBlock->nRow, pos, pReader->window.skey, order); + } } // time window check @@ -932,8 +936,8 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn pDumpInfo->rowIndex += step * remain; if (pDumpInfo->rowIndex >= 0 && pDumpInfo->rowIndex < pBlock->nRow) { - int64_t ts = pBlockData->aTSKEY[pDumpInfo->rowIndex]; - setBlockAllDumped(pDumpInfo, ts, pReader->order); +// int64_t ts = pBlockData->aTSKEY[pDumpInfo->rowIndex]; +// setBlockAllDumped(pDumpInfo, ts, pReader->order); } else { int64_t k = asc ? pBlock->maxKey.ts : pBlock->minKey.ts; setBlockAllDumped(pDumpInfo, k, pReader->order); From cde4085a6d43ea2825233244fbb8d6c2a41962b6 Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Wed, 28 Sep 2022 20:24:02 +0800 Subject: [PATCH 051/143] optimize msg batch --- include/common/tcommon.h | 1 + source/client/src/clientTmq.c | 6 +++++- source/dnode/vnode/src/tq/tq.c | 3 +++ source/dnode/vnode/src/tq/tqPush.c | 4 ++++ source/dnode/vnode/src/tq/tqRead.c | 9 +++++++-- source/libs/executor/inc/executorimpl.h | 1 + source/libs/executor/src/projectoperator.c | 14 +++++++++++++- source/libs/executor/src/scanoperator.c | 10 ++++++---- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/include/common/tcommon.h b/include/common/tcommon.h index 2544cedda7..2add3332ab 100644 --- a/include/common/tcommon.h +++ b/include/common/tcommon.h @@ -177,6 +177,7 @@ typedef struct SSDataBlock { enum { FETCH_TYPE__DATA = 1, FETCH_TYPE__META, + FETCH_TYPE__SEP, FETCH_TYPE__NONE, }; diff --git a/source/client/src/clientTmq.c b/source/client/src/clientTmq.c index e0f48a4534..66f992f05f 100644 --- a/source/client/src/clientTmq.c +++ b/source/client/src/clientTmq.c @@ -1603,6 +1603,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) { return NULL; } else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__POLL_RSP) { SMqPollRspWrapper* pollRspWrapper = (SMqPollRspWrapper*)rspWrapper; + tscDebug("consumer %ld actual process poll rsp", tmq->consumerId); /*atomic_sub_fetch_32(&tmq->readyRequest, 1);*/ int32_t consumerEpoch = atomic_load_32(&tmq->epoch); if (pollRspWrapper->dataRsp.head.epoch == consumerEpoch) { @@ -1718,7 +1719,10 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t timeout) { while (1) { tmqHandleAllDelayedTask(tmq); - if (tmqPollImpl(tmq, timeout) < 0) return NULL; + if (tmqPollImpl(tmq, timeout) < 0) { + tscDebug("return since poll err"); + /*return NULL;*/ + } rspObj = tmqHandleAllRsp(tmq, timeout, false); if (rspObj) { diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 490a313cd4..070abadee2 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -420,6 +420,8 @@ static int32_t tqInitDataRsp(SMqDataRsp* pRsp, const SMqPollReq* pReq, int8_t su return -1; } + pRsp->withTbName = 0; +#if 0 pRsp->withTbName = pReq->withTbName; if (pRsp->withTbName) { pRsp->blockTbName = taosArrayInit(0, sizeof(void*)); @@ -428,6 +430,7 @@ static int32_t tqInitDataRsp(SMqDataRsp* pRsp, const SMqPollReq* pReq, int8_t su return -1; } } +#endif if (subType == TOPIC_SUB_TYPE__COLUMN) { pRsp->withSchema = false; diff --git a/source/dnode/vnode/src/tq/tqPush.c b/source/dnode/vnode/src/tq/tqPush.c index 13ed36e2bc..e7d6c1eb47 100644 --- a/source/dnode/vnode/src/tq/tqPush.c +++ b/source/dnode/vnode/src/tq/tqPush.c @@ -213,6 +213,8 @@ int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_ #endif int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) { + tqDebug("vgId:%d tq push msg ver %ld", pTq->pVnode->config.vgId, ver); + if (msgType == TDMT_VND_SUBMIT) { // lock push mgr to avoid potential msg lost taosWLockLatch(&pTq->pushLock); @@ -257,6 +259,8 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) pRsp->blockNum++; } + tqDebug("vgId:%d tq handle push, subkey: %s, block num: %d", pTq->pVnode->config.vgId, + pPushEntry->pHandle->subKey, pRsp->blockNum); if (pRsp->blockNum > 0) { // set offset tqOffsetResetToLog(&pRsp->rspOffset, ver); diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index d93a8fe030..3bd31e6660 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -314,14 +314,18 @@ int32_t tqNextBlock(STqReader* pReader, SFetchRet* ret) { return -1; } void* body = pReader->pWalReader->pHead->head.body; +#if 0 if (pReader->pWalReader->pHead->head.msgType != TDMT_VND_SUBMIT) { // TODO do filter ret->fetchType = FETCH_TYPE__META; ret->meta = pReader->pWalReader->pHead->head.body; return 0; } else { - tqReaderSetDataMsg(pReader, body, pReader->pWalReader->pHead->head.version); +#endif + tqReaderSetDataMsg(pReader, body, pReader->pWalReader->pHead->head.version); +#if 0 } +#endif } while (tqNextDataBlock(pReader)) { @@ -333,6 +337,7 @@ int32_t tqNextBlock(STqReader* pReader, SFetchRet* ret) { continue; } ret->fetchType = FETCH_TYPE__DATA; + tqDebug("return data rows %d", ret->data.info.rows); return 0; } @@ -340,7 +345,7 @@ int32_t tqNextBlock(STqReader* pReader, SFetchRet* ret) { ret->offset.type = TMQ_OFFSET__LOG; ret->offset.version = pReader->ver; ASSERT(pReader->ver >= 0); - ret->fetchType = FETCH_TYPE__NONE; + ret->fetchType = FETCH_TYPE__SEP; tqDebug("return offset %" PRId64 ", processed finish", ret->offset.version); return 0; } diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index 27760d7969..56470f0668 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -193,6 +193,7 @@ enum { OP_OPENED = 0x1, OP_RES_TO_RETURN = 0x5, OP_EXEC_DONE = 0x9, + OP_EXEC_RECV = 0x11, }; typedef struct SOperatorFpSet { diff --git a/source/libs/executor/src/projectoperator.c b/source/libs/executor/src/projectoperator.c index b7c5b5634e..8d40824cc4 100644 --- a/source/libs/executor/src/projectoperator.c +++ b/source/libs/executor/src/projectoperator.c @@ -241,9 +241,20 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) { // The downstream exec may change the value of the newgroup, so use a local variable instead. SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); if (pBlock == NULL) { + if (pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE && pOperator->status == OP_EXEC_RECV && + pFinalRes->info.rows == 0) { + pOperator->status = OP_OPENED; + continue; + } + qDebug("set op close, exec %d, status %d rows %d", pTaskInfo->execModel, pOperator->status, + pFinalRes->info.rows); doSetOperatorCompleted(pOperator); break; } + if (pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE) { + qDebug("set status recv"); + pOperator->status = OP_EXEC_RECV; + } // for stream interval if (pBlock->info.type == STREAM_RETRIEVE || pBlock->info.type == STREAM_DELETE_RESULT || @@ -258,7 +269,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) { } setInfoForNewGroup(pBlock, pLimitInfo, pOperator); - if (pTaskInfo->execModel == OPTR_EXEC_MODEL_BATCH && pOperator->status == OP_EXEC_DONE) { + if (pOperator->status == OP_EXEC_DONE) { break; } @@ -302,6 +313,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) { // when apply the limit/offset for each group, pRes->info.rows may be 0, due to limit constraint. if (pFinalRes->info.rows > 0 || (pOperator->status == OP_EXEC_DONE)) { + qDebug("project return %d rows, status %d", pFinalRes->info.rows, pOperator->status); break; } } else { diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 46280295b9..927ef2c64d 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1504,8 +1504,8 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { if (setBlockIntoRes(pInfo, &ret.data) < 0) { ASSERT(0); } - // TODO clean data block if (pInfo->pRes->info.rows > 0) { + pOperator->status = OP_EXEC_RECV; qDebug("queue scan log return %d rows", pInfo->pRes->info.rows); return pInfo->pRes; } @@ -1514,18 +1514,19 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { // pTaskInfo->streamInfo.lastStatus = ret.offset; // pTaskInfo->streamInfo.metaBlk = ret.meta; // return NULL; - } else if (ret.fetchType == FETCH_TYPE__NONE) { + } else if (ret.fetchType == FETCH_TYPE__NONE || + (ret.fetchType == FETCH_TYPE__SEP && pOperator->status == OP_EXEC_RECV)) { pTaskInfo->streamInfo.lastStatus = ret.offset; ASSERT(pTaskInfo->streamInfo.lastStatus.version >= pTaskInfo->streamInfo.prepareStatus.version); ASSERT(pTaskInfo->streamInfo.lastStatus.version + 1 == pInfo->tqReader->pWalReader->curVersion); char formatBuf[80]; tFormatOffset(formatBuf, 80, &ret.offset); qDebug("queue scan log return null, offset %s", formatBuf); + pOperator->status = OP_OPENED; return NULL; - } else { - ASSERT(0); } } +#if 0 } else if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA) { SSDataBlock* pResult = doTableScan(pInfo->pTableScanOp); if (pResult && pResult->info.rows > 0) { @@ -1534,6 +1535,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { } qDebug("stream scan tsdb return null"); return NULL; +#endif } else { ASSERT(0); return NULL; From 1286f7473cc2a4ece9f0ea1789f68f6a97d7a73c Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 28 Sep 2022 22:07:16 +0800 Subject: [PATCH 052/143] QRY: opt tbname in --- source/dnode/vnode/inc/vnode.h | 3 ++ source/dnode/vnode/src/meta/metaOpen.c | 12 ++--- source/dnode/vnode/src/meta/metaQuery.c | 15 ++++++ source/dnode/vnode/src/vnd/vnodeQuery.c | 3 ++ source/libs/executor/src/executil.c | 68 +++++++++++++++++++++---- 5 files changed, 83 insertions(+), 18 deletions(-) diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 6ba10641f5..35ea512f81 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -62,7 +62,9 @@ void vnodeGetSnapshot(SVnode *pVnode, SSnapshot *pSnapshot); void vnodeGetInfo(SVnode *pVnode, const char **dbname, int32_t *vgId); int32_t vnodeProcessCreateTSma(SVnode *pVnode, void *pCont, uint32_t contLen); int32_t vnodeGetAllTableList(SVnode *pVnode, uint64_t uid, SArray *list); + int32_t vnodeGetCtbIdList(SVnode *pVnode, int64_t suid, SArray *list); +int32_t vnodeGetCtbIdListByFilter(SVnode *pVnode, int64_t suid, SArray *list, bool (*filter)(void *arg), void *arg); int32_t vnodeGetStbIdList(SVnode *pVnode, int64_t suid, SArray *list); void *vnodeGetIdx(SVnode *pVnode); void *vnodeGetIvtIdx(SVnode *pVnode); @@ -96,6 +98,7 @@ int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHash int32_t metaReadNext(SMetaReader *pReader); const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal); int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName); +int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid); bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid); typedef struct SMetaFltParam { diff --git a/source/dnode/vnode/src/meta/metaOpen.c b/source/dnode/vnode/src/meta/metaOpen.c index f8ecd17cb7..034d6260da 100644 --- a/source/dnode/vnode/src/meta/metaOpen.c +++ b/source/dnode/vnode/src/meta/metaOpen.c @@ -200,36 +200,30 @@ int metaClose(SMeta *pMeta) { int32_t metaRLock(SMeta *pMeta) { int32_t ret = 0; - metaTrace("meta rlock %p B", &pMeta->lock); + metaTrace("meta rlock %p", &pMeta->lock); ret = taosThreadRwlockRdlock(&pMeta->lock); - metaTrace("meta rlock %p E", &pMeta->lock); - return ret; } int32_t metaWLock(SMeta *pMeta) { int32_t ret = 0; - metaTrace("meta wlock %p B", &pMeta->lock); + metaTrace("meta wlock %p", &pMeta->lock); ret = taosThreadRwlockWrlock(&pMeta->lock); - metaTrace("meta wlock %p E", &pMeta->lock); - return ret; } int32_t metaULock(SMeta *pMeta) { int32_t ret = 0; - metaTrace("meta ulock %p B", &pMeta->lock); + metaTrace("meta ulock %p", &pMeta->lock); ret = taosThreadRwlockUnlock(&pMeta->lock); - metaTrace("meta ulock %p E", &pMeta->lock); - return ret; } diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index f549ef84f8..995e30bd4c 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -202,6 +202,21 @@ int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName) { return 0; } +int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid) { + int code = 0; + SMetaReader mr = {0}; + metaReaderInit(&mr, (SMeta *)meta, 0); + code = metaGetTableEntryByName(&mr, tbName); + if (code < 0) { + metaReaderClear(&mr); + return -1; + } + *uid = mr.me.uid; + + metaReaderClear(&mr); + + return 0; +} int metaReadNext(SMetaReader *pReader) { SMeta *pMeta = pReader->pMeta; diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c index 825bf8a0a7..6806c034dc 100644 --- a/source/dnode/vnode/src/vnd/vnodeQuery.c +++ b/source/dnode/vnode/src/vnd/vnodeQuery.c @@ -409,6 +409,9 @@ int32_t vnodeGetAllTableList(SVnode *pVnode, uint64_t uid, SArray *list) { return TSDB_CODE_SUCCESS; } +int32_t vnodeGetCtbIdListByFilter(SVnode *pVnode, int64_t suid, SArray *list, bool (*filter)(void *arg), void *arg) { + return 0; +} int32_t vnodeGetCtbIdList(SVnode *pVnode, int64_t suid, SArray *list) { SMCtbCursor *pCur = metaOpenCtbCursor(pVnode->pMeta, suid); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index b26603b394..fa0142973b 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -26,6 +26,8 @@ #include "executorimpl.h" #include "tcompression.h" +static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond); + void initResultRowInfo(SResultRowInfo* pResultRowInfo) { pResultRowInfo->size = 0; pResultRowInfo->cur.pageId = -1; @@ -407,11 +409,15 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray // int64_t stt = taosGetTimestampUs(); tags = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); - code = metaGetTableTags(metaHandle, suid, uidList, tags); - if (code != TSDB_CODE_SUCCESS) { - qError("failed to get table tags from meta, reason:%s, suid:%" PRIu64, tstrerror(code), suid); - terrno = code; - goto end; + + int32_t filter = optimizeTbnameInCond(metaHandle, suid, uidList, pTagCond); + if (filter == -1) { + code = metaGetTableTags(metaHandle, suid, uidList, tags); + if (code != TSDB_CODE_SUCCESS) { + qError("failed to get table tags from meta, reason:%s, suid:%" PRIu64, tstrerror(code), suid); + terrno = code; + goto end; + } } int32_t rows = taosArrayGetSize(uidList); @@ -742,6 +748,53 @@ end: return code; } +static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond) { + if (nodeType(pTagCond) != QUERY_NODE_OPERATOR) { + return -1; + } + SOperatorNode* pNode = (SOperatorNode*)pTagCond; + if (pNode->opType != OP_TYPE_IN) { + return -1; + } + if ((pNode->pLeft != NULL && nodeType(pNode->pLeft) == QUERY_NODE_COLUMN && + ((SColumnNode*)pNode->pLeft)->colType == COLUMN_TYPE_TBNAME) && + (pNode->pRight != NULL && nodeType(pNode->pRight) == QUERY_NODE_NODE_LIST)) { + SNodeListNode* pList = (SNodeListNode*)pNode->pRight; + + int32_t len = LIST_LENGTH(pList->pNodeList); + if (len <= 0) return -1; + + SListCell* cell = pList->pNodeList->pHead; + + SArray* pTbList = taosArrayInit(len, sizeof(void*)); + for (int i = 0; i < pList->pNodeList->length; i++) { + SValueNode* valueNode = (SValueNode*)cell->pNode; + if (!IS_VAR_DATA_TYPE(valueNode->node.resType.type)) { + taosArrayDestroy(pTbList); + return -1; + } + char* name = varDataVal(valueNode->datum.p); + taosArrayPush(pTbList, &name); + + cell = cell->pNext; + } + + for (int i = 0; i < taosArrayGetSize(pTbList); i++) { + char* name = taosArrayGetP(pTbList, i); + uint64_t uid = 0; + if (metaGetTableUidByName(metaHandle, name, &uid) == 0) { + taosArrayPush(list, &uid); + } else { + terrno = 0; + qError("failed to get tableIds from by table name: %s", name); + taosArrayDestroy(pTbList); + return -1; + } + } + taosArrayDestroy(pTbList); + } + return -1; +} int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, SNode* pTagIndexCond, STableListInfo* pListInfo) { int32_t code = TSDB_CODE_SUCCESS; @@ -767,9 +820,6 @@ int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, qError("failed to get tableIds from index, reason:%s, suid:%" PRIu64, tstrerror(code), tableUid); code = TDB_CODE_SUCCESS; } - - // int64_t stt1 = taosGetTimestampUs(); - // qDebug("generate table list, cost:%ld us", stt1-stt); } else if (!pTagCond) { vnodeGetCtbIdList(pVnode, pScanNode->suid, res); } @@ -813,7 +863,7 @@ int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, size_t numOfTables = taosArrayGetSize(res); for (int i = 0; i < numOfTables; i++) { STableKeyInfo info = {.uid = *(uint64_t*)taosArrayGet(res, i), .groupId = 0}; - void* p = taosArrayPush(pListInfo->pTableList, &info); + void* p = taosArrayPush(pListInfo->pTableList, &info); if (p == NULL) { taosArrayDestroy(res); return TSDB_CODE_OUT_OF_MEMORY; From fab0adde99fda3dbeb3a7eed1bdac2b8fa32825d Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Wed, 28 Sep 2022 21:44:37 +0800 Subject: [PATCH 053/143] fix memory error --- source/dnode/vnode/src/inc/tq.h | 2 +- source/dnode/vnode/src/tq/tq.c | 11 +++++++++-- source/dnode/vnode/src/tq/tqPush.c | 20 ++++++++++++++------ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/source/dnode/vnode/src/inc/tq.h b/source/dnode/vnode/src/inc/tq.h index 04b0813445..f96afe6fba 100644 --- a/source/dnode/vnode/src/inc/tq.h +++ b/source/dnode/vnode/src/inc/tq.h @@ -116,7 +116,7 @@ typedef struct { typedef struct { SMqDataRsp dataRsp; SMqRspHead rspHead; - STqHandle* pHandle; + char subKey[TSDB_SUBSCRIBE_KEY_LEN]; SRpcHandleInfo pInfo; } STqPushEntry; diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 070abadee2..d0e7d2c766 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -554,8 +554,8 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) { if (dataRsp.blockNum == 0) { STqPushEntry* pPushEntry = taosMemoryCalloc(1, sizeof(STqPushEntry)); if (pPushEntry != NULL) { - pPushEntry->pHandle = pHandle; pPushEntry->pInfo = pMsg->info; + memcpy(pPushEntry->subKey, pHandle->subKey, TSDB_SUBSCRIBE_KEY_LEN); dataRsp.withTbName = 0; memcpy(&pPushEntry->dataRsp, &dataRsp, sizeof(SMqDataRsp)); pPushEntry->rspHead.consumerId = consumerId; @@ -704,7 +704,14 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) { int32_t tqProcessVgDeleteReq(STQ* pTq, int64_t version, char* msg, int32_t msgLen) { SMqVDeleteReq* pReq = (SMqVDeleteReq*)msg; - int32_t code = taosHashRemove(pTq->pHandle, pReq->subKey, strlen(pReq->subKey)); + taosWLockLatch(&pTq->pushLock); + int32_t code = taosHashRemove(pTq->pPushMgr, pReq->subKey, strlen(pReq->subKey)); + if (code != 0) { + tqDebug("vgId:%d, tq remove push handle %s", pTq->pVnode->config.vgId, pReq->subKey); + } + taosWUnLockLatch(&pTq->pushLock); + + code = taosHashRemove(pTq->pHandle, pReq->subKey, strlen(pReq->subKey)); if (code != 0) { tqError("cannot process tq delete req %s, since no such handle", pReq->subKey); } diff --git a/source/dnode/vnode/src/tq/tqPush.c b/source/dnode/vnode/src/tq/tqPush.c index e7d6c1eb47..4bd47f4e83 100644 --- a/source/dnode/vnode/src/tq/tqPush.c +++ b/source/dnode/vnode/src/tq/tqPush.c @@ -213,11 +213,12 @@ int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_ #endif int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) { - tqDebug("vgId:%d tq push msg ver %ld", pTq->pVnode->config.vgId, ver); + tqDebug("vgId:%d tq push msg ver %ld, type: %s", pTq->pVnode->config.vgId, ver, TMSG_INFO(msgType)); if (msgType == TDMT_VND_SUBMIT) { // lock push mgr to avoid potential msg lost taosWLockLatch(&pTq->pushLock); + tqDebug("vgId:%d push handle num %d", pTq->pVnode->config.vgId, taosHashGetSize(pTq->pPushMgr)); if (taosHashGetSize(pTq->pPushMgr) != 0) { SArray* cachedKeys = taosArrayInit(0, sizeof(void*)); SArray* cachedKeyLens = taosArrayInit(0, sizeof(size_t)); @@ -235,10 +236,17 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) while (1) { pIter = taosHashIterate(pTq->pPushMgr, pIter); if (pIter == NULL) break; - STqPushEntry* pPushEntry = *(STqPushEntry**)pIter; - STqExecHandle* pExec = &pPushEntry->pHandle->execHandle; + STqPushEntry* pPushEntry = *(STqPushEntry**)pIter; + + STqHandle* pHandle = taosHashGet(pTq->pHandle, pPushEntry->subKey, strlen(pPushEntry->subKey)); + if (pHandle == NULL) { + tqDebug("vgId:%d cannot find handle %s", pTq->pVnode->config.vgId, pPushEntry->subKey); + continue; + } + STqExecHandle* pExec = &pHandle->execHandle; qTaskInfo_t task = pExec->task; - SMqDataRsp* pRsp = &pPushEntry->dataRsp; + + SMqDataRsp* pRsp = &pPushEntry->dataRsp; // prepare scan mem data qStreamScanMemData(task, pReq); @@ -259,8 +267,8 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) pRsp->blockNum++; } - tqDebug("vgId:%d tq handle push, subkey: %s, block num: %d", pTq->pVnode->config.vgId, - pPushEntry->pHandle->subKey, pRsp->blockNum); + tqDebug("vgId:%d tq handle push, subkey: %s, block num: %d", pTq->pVnode->config.vgId, pPushEntry->subKey, + pRsp->blockNum); if (pRsp->blockNum > 0) { // set offset tqOffsetResetToLog(&pRsp->rspOffset, ver); From b0a46942c2a61168aa8899c8ec62a5aaf67b18ad Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Wed, 28 Sep 2022 23:47:47 +0800 Subject: [PATCH 054/143] rsp to consumer if offset move forward --- source/dnode/vnode/src/tq/tq.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index d0e7d2c766..b08d2d52e0 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -551,7 +551,8 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) { tqScanData(pTq, pHandle, &dataRsp, &fetchOffsetNew); #if 1 - if (dataRsp.blockNum == 0) { + if (dataRsp.blockNum == 0 && dataRsp.rspOffset.type == TMQ_OFFSET__LOG && + dataRsp.reqOffset.version == dataRsp.rspOffset.version) { STqPushEntry* pPushEntry = taosMemoryCalloc(1, sizeof(STqPushEntry)); if (pPushEntry != NULL) { pPushEntry->pInfo = pMsg->info; From cf0aecd3dd5701082f94eb73f94a0e9c692ecd44 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 29 Sep 2022 00:02:09 +0800 Subject: [PATCH 055/143] more fix --- source/util/src/tcompression.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index 9cac1fb957..b19bfbbd43 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1320,7 +1320,7 @@ static int32_t tCompTSSwitchToCopy(SCompressor *pCmprsor) { } } - ASSERT(n == pCmprsor->nBuf && nBuf == sizeof(int64_t) * pCmprsor->nBuf + 1); + ASSERT(n == pCmprsor->nBuf && nBuf == sizeof(int64_t) * pCmprsor->nVal + 1); uint8_t *pBuf = pCmprsor->pBuf; pCmprsor->pBuf = pCmprsor->aBuf[0]; From a2a8fe02113e6c21f8848d99e529f2a769d85743 Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Thu, 29 Sep 2022 01:06:42 +0800 Subject: [PATCH 056/143] rsp consumer when taosd stop --- source/dnode/vnode/src/tq/tq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index b08d2d52e0..e7eab7ab73 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -66,7 +66,7 @@ static void destroySTqHandle(void* data) { } static void tqPushEntryFree(void* data) { - void* p = *(void**)data; + STqPushEntry* p = *(void**)data; taosMemoryFree(p); } From 5b4d0eaabe6cf34bf7d6f1af77b77a68f6f5236d Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Sep 2022 11:07:32 +0800 Subject: [PATCH 057/143] enh: opt tbname in --- source/dnode/vnode/src/inc/vnodeInt.h | 38 +++++++++++++------------ source/dnode/vnode/src/meta/metaQuery.c | 11 +++++-- source/libs/executor/src/executil.c | 8 +++--- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 4c8045d651..ec570b4540 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -111,22 +111,23 @@ SSchemaWrapper* metaGetTableSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, boo STSchema* metaGetTbTSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver); int32_t metaGetTbTSchemaEx(SMeta* pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sver, STSchema** ppTSchema); int metaGetTableEntryByName(SMetaReader* pReader, const char* name); -tb_uid_t metaGetTableEntryUidByName(SMeta* pMeta, const char* name); -int64_t metaGetTbNum(SMeta* pMeta); -int64_t metaGetTimeSeriesNum(SMeta* pMeta); -SMCtbCursor* metaOpenCtbCursor(SMeta* pMeta, tb_uid_t uid); -void metaCloseCtbCursor(SMCtbCursor* pCtbCur); -tb_uid_t metaCtbCursorNext(SMCtbCursor* pCtbCur); -SMStbCursor* metaOpenStbCursor(SMeta* pMeta, tb_uid_t uid); -void metaCloseStbCursor(SMStbCursor* pStbCur); -tb_uid_t metaStbCursorNext(SMStbCursor* pStbCur); -STSma* metaGetSmaInfoByIndex(SMeta* pMeta, int64_t indexUid); -STSmaWrapper* metaGetSmaInfoByTable(SMeta* pMeta, tb_uid_t uid, bool deepCopy); -SArray* metaGetSmaIdsByTable(SMeta* pMeta, tb_uid_t uid); -SArray* metaGetSmaTbUids(SMeta* pMeta); -void* metaGetIdx(SMeta* pMeta); -void* metaGetIvtIdx(SMeta* pMeta); -int metaTtlSmaller(SMeta* pMeta, uint64_t time, SArray* uidList); + +tb_uid_t metaGetTableEntryUidByName(SMeta* pMeta, const char* name); +int64_t metaGetTbNum(SMeta* pMeta); +int64_t metaGetTimeSeriesNum(SMeta* pMeta); +SMCtbCursor* metaOpenCtbCursor(SMeta* pMeta, tb_uid_t uid); +void metaCloseCtbCursor(SMCtbCursor* pCtbCur); +tb_uid_t metaCtbCursorNext(SMCtbCursor* pCtbCur); +SMStbCursor* metaOpenStbCursor(SMeta* pMeta, tb_uid_t uid); +void metaCloseStbCursor(SMStbCursor* pStbCur); +tb_uid_t metaStbCursorNext(SMStbCursor* pStbCur); +STSma* metaGetSmaInfoByIndex(SMeta* pMeta, int64_t indexUid); +STSmaWrapper* metaGetSmaInfoByTable(SMeta* pMeta, tb_uid_t uid, bool deepCopy); +SArray* metaGetSmaIdsByTable(SMeta* pMeta, tb_uid_t uid); +SArray* metaGetSmaTbUids(SMeta* pMeta); +void* metaGetIdx(SMeta* pMeta); +void* metaGetIvtIdx(SMeta* pMeta); +int metaTtlSmaller(SMeta* pMeta, uint64_t time, SArray* uidList); int32_t metaCreateTSma(SMeta* pMeta, int64_t version, SSmaCfg* pCfg); int32_t metaDropTSma(SMeta* pMeta, int64_t indexUid); @@ -184,8 +185,9 @@ int32_t tqProcessTaskRecoverRsp(STQ* pTq, SRpcMsg* pMsg); int32_t tqProcessTaskRetrieveReq(STQ* pTq, SRpcMsg* pMsg); int32_t tqProcessTaskRetrieveRsp(STQ* pTq, SRpcMsg* pMsg); -SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchema* pSchema, SSchemaWrapper* pTagSchemaWrapper, bool createTb, int64_t suid, - const char* stbFullName, SBatchDeleteReq* pDeleteReq); +SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchema* pSchema, + SSchemaWrapper* pTagSchemaWrapper, bool createTb, int64_t suid, const char* stbFullName, + SBatchDeleteReq* pDeleteReq); // sma int32_t smaInit(); diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 995e30bd4c..33af87bf73 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -206,13 +206,18 @@ int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid) { int code = 0; SMetaReader mr = {0}; metaReaderInit(&mr, (SMeta *)meta, 0); - code = metaGetTableEntryByName(&mr, tbName); - if (code < 0) { + + SMeta *pMeta = mr.pMeta; + SMetaReader *pReader = &mr; + + // query name.idx + if (tdbTbGet(pMeta->pNameIdx, tbName, strlen(tbName) + 1, &pReader->pBuf, &pReader->szBuf) < 0) { + terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; metaReaderClear(&mr); return -1; } - *uid = mr.me.uid; + *uid = *(tb_uid_t *)pReader->pBuf; metaReaderClear(&mr); return 0; diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index fa0142973b..1ece2f902f 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -418,6 +418,8 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray terrno = code; goto end; } + } else { + qInfo("succ to get table from meta, suid:%" PRIu64, suid); } int32_t rows = taosArrayGetSize(uidList); @@ -785,15 +787,13 @@ static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list if (metaGetTableUidByName(metaHandle, name, &uid) == 0) { taosArrayPush(list, &uid); } else { + qWarn("failed to get tableIds from by table name: %s, reason: %s", name, tstrerror(terrno)); terrno = 0; - qError("failed to get tableIds from by table name: %s", name); - taosArrayDestroy(pTbList); - return -1; } } taosArrayDestroy(pTbList); } - return -1; + return 0; } int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, SNode* pTagIndexCond, STableListInfo* pListInfo) { From 7aa2ffc4a8d7ac63a66ed8b99b843b35a9150244 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Thu, 29 Sep 2022 11:09:23 +0800 Subject: [PATCH 058/143] docs: remove influx_max_line_bytes for 3.0 (#17137) --- docs/en/14-reference/_telegraf.mdx | 1 - docs/en/25-application/01-telegraf.md | 1 - docs/zh/14-reference/_telegraf.mdx | 1 - docs/zh/25-application/01-telegraf.md | 1 - 4 files changed, 4 deletions(-) diff --git a/docs/en/14-reference/_telegraf.mdx b/docs/en/14-reference/_telegraf.mdx index e32fb25693..bcf1a0893f 100644 --- a/docs/en/14-reference/_telegraf.mdx +++ b/docs/en/14-reference/_telegraf.mdx @@ -22,5 +22,4 @@ An example is as follows. username = "root" password = "taosdata" data_format = "influx" - influx_max_line_bytes = 250 ``` diff --git a/docs/en/25-application/01-telegraf.md b/docs/en/25-application/01-telegraf.md index 59491152bc..f700326449 100644 --- a/docs/en/25-application/01-telegraf.md +++ b/docs/en/25-application/01-telegraf.md @@ -60,7 +60,6 @@ For the configuration method, add the following text to `/etc/telegraf/telegraf. username = "" password = "" data_format = "influx" - influx_max_line_bytes = 250 ``` Then restart telegraf: diff --git a/docs/zh/14-reference/_telegraf.mdx b/docs/zh/14-reference/_telegraf.mdx index bae46d6606..3f92e5dde0 100644 --- a/docs/zh/14-reference/_telegraf.mdx +++ b/docs/zh/14-reference/_telegraf.mdx @@ -22,6 +22,5 @@ username = "root" password = "taosdata" data_format = "influx" - influx_max_line_bytes = 250 ``` diff --git a/docs/zh/25-application/01-telegraf.md b/docs/zh/25-application/01-telegraf.md index 4e9597f964..6338264d17 100644 --- a/docs/zh/25-application/01-telegraf.md +++ b/docs/zh/25-application/01-telegraf.md @@ -61,7 +61,6 @@ IT 运维监测数据通常都是对时间特性比较敏感的数据,例如 username = "" password = "" data_format = "influx" - influx_max_line_bytes = 250 ``` 然后重启 Telegraf: From 5d0357fc4741c7665539a4a6d0e1a36e2db85013 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Thu, 29 Sep 2022 11:14:35 +0800 Subject: [PATCH 059/143] fix: very long string serialization problem --- source/libs/nodes/src/nodesMsgFuncs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/nodes/src/nodesMsgFuncs.c b/source/libs/nodes/src/nodesMsgFuncs.c index 8d1d332ac7..cdc4e66e42 100644 --- a/source/libs/nodes/src/nodesMsgFuncs.c +++ b/source/libs/nodes/src/nodesMsgFuncs.c @@ -90,12 +90,12 @@ static void endTlvEncode(STlvEncoder* pEncoder, char** pMsg, int32_t* pLen) { static int32_t tlvEncodeImpl(STlvEncoder* pEncoder, int16_t type, const void* pValue, int32_t len) { int32_t tlvLen = sizeof(STlv) + len; if (pEncoder->offset + tlvLen > pEncoder->allocSize) { - void* pNewBuf = taosMemoryRealloc(pEncoder->pBuf, pEncoder->allocSize * 2); + pEncoder->allocSize = TMAX(pEncoder->allocSize * 2, pEncoder->allocSize + pEncoder->offset + tlvLen); + void* pNewBuf = taosMemoryRealloc(pEncoder->pBuf, pEncoder->allocSize); if (NULL == pNewBuf) { return TSDB_CODE_OUT_OF_MEMORY; } pEncoder->pBuf = pNewBuf; - pEncoder->allocSize = pEncoder->allocSize * 2; } STlv* pTlv = (STlv*)(pEncoder->pBuf + pEncoder->offset); pTlv->type = htons(type); From 4c00225e9fe24c07f59048e7762fe7eb53d04753 Mon Sep 17 00:00:00 2001 From: shenglian zhou Date: Thu, 29 Sep 2022 11:26:58 +0800 Subject: [PATCH 060/143] fix: fix coverity scan issue in tudf.c and udfd.c --- source/libs/function/src/tudf.c | 2 ++ source/libs/function/src/udfd.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c index 62427e0488..060a92f864 100644 --- a/source/libs/function/src/tudf.c +++ b/source/libs/function/src/tudf.c @@ -1656,6 +1656,8 @@ int32_t doSetupUdf(char udfName[], UdfcFuncHandle *funcHandle) { int32_t errCode = udfcRunUdfUvTask(task, UV_TASK_CONNECT); if (errCode != 0) { fnError("failed to connect to pipe. udfName: %s, pipe: %s", udfName, (&gUdfdProxy)->udfdPipeName); + taosMemoryFree(task->session); + taosMemoryFree(task); return TSDB_CODE_UDF_PIPE_CONNECT_ERR; } diff --git a/source/libs/function/src/udfd.c b/source/libs/function/src/udfd.c index 636f006d6e..8ff0dc15a5 100644 --- a/source/libs/function/src/udfd.c +++ b/source/libs/function/src/udfd.c @@ -960,7 +960,7 @@ int32_t udfdInitResidentFuncs() { char* token; while ((token = strtok_r(pSave, ",", &pSave)) != NULL) { char func[TSDB_FUNC_NAME_LEN] = {0}; - strncpy(func, token, strlen(token)); + strncpy(func, token, sizeof(func)); taosArrayPush(global.residentFuncs, func); } From 299343092a4ed78decbc403d089b98d7a4da7323 Mon Sep 17 00:00:00 2001 From: WANG MINGMING Date: Thu, 29 Sep 2022 11:41:34 +0800 Subject: [PATCH 061/143] Update 04-taosadapter.md --- docs/zh/14-reference/04-taosadapter.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh/14-reference/04-taosadapter.md b/docs/zh/14-reference/04-taosadapter.md index 82efcab06f..ec023afd71 100644 --- a/docs/zh/14-reference/04-taosadapter.md +++ b/docs/zh/14-reference/04-taosadapter.md @@ -189,7 +189,7 @@ AllowWebSockets /influxdb/v1/write ``` -支持 InfluxDB 查询参数如下: +支持 InfluxDB 参数如下: - `db` 指定 TDengine 使用的数据库名 - `precision` TDengine 使用的时间精度 @@ -197,7 +197,7 @@ AllowWebSockets - `p` TDengine 密码 注意: 目前不支持 InfluxDB 的 token 验证方式,仅支持 Basic 验证和查询参数验证。 - +示例: curl --request POST http://127.0.0.1:6041/influxdb/v1/write?db=test --user "root:taosdata" --data-binary "measurement,host=host1 field1=2i,field2=2.0 1577836800000000000" ### OpenTSDB 您可以使用任何支持 http 协议的客户端访问 Restful 接口地址 `http://:6041/` 来写入 OpenTSDB 兼容格式的数据到 TDengine。EndPoint 如下: From f3a955afe72688e8b0cb8f6c5b3d13669d86fd34 Mon Sep 17 00:00:00 2001 From: WANG MINGMING Date: Thu, 29 Sep 2022 11:42:37 +0800 Subject: [PATCH 062/143] Update 04-taosadapter.md --- docs/en/14-reference/04-taosadapter.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/en/14-reference/04-taosadapter.md b/docs/en/14-reference/04-taosadapter.md index 78c4febb92..ad00584360 100644 --- a/docs/en/14-reference/04-taosadapter.md +++ b/docs/en/14-reference/04-taosadapter.md @@ -196,7 +196,8 @@ Support InfluxDB query parameters as follows. - `u` TDengine user name - `p` TDengine password -Note: InfluxDB token authorization is not supported at present. Only Basic authorization and query parameter validation are supported. +Note: InfluxDB token authorization is not supported at present. Only Basic authorization and query parameter validation are supported. +Example: curl --request POST http://127.0.0.1:6041/influxdb/v1/write?db=test --user "root:taosdata" --data-binary "measurement,host=host1 field1=2i,field2=2.0 1577836800000000000" ### OpenTSDB From bb1165f1e95404b128e1f12692361aaa8107bd06 Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Thu, 29 Sep 2022 12:14:41 +0800 Subject: [PATCH 063/143] optimize projection return --- source/dnode/vnode/src/tq/tq.c | 4 ++-- source/libs/executor/src/projectoperator.c | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index e7eab7ab73..ed5a894416 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -214,7 +214,7 @@ int32_t tqPushDataRsp(STQ* pTq, STqPushEntry* pPushEntry) { tFormatOffset(buf1, 80, &pRsp->reqOffset); tFormatOffset(buf2, 80, &pRsp->rspOffset); tqDebug("vgId:%d, from consumer:%" PRId64 ", (epoch %d) push rsp, block num: %d, reqOffset:%s, rspOffset:%s", - TD_VID(pTq->pVnode), pRsp->head.consumerId, pRsp->head.epoch, pRsp->blockNum, buf1, buf2); + TD_VID(pTq->pVnode), pPushEntry->rspHead.consumerId, pRsp->head.epoch, pRsp->blockNum, buf1, buf2); return 0; } @@ -551,7 +551,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) { tqScanData(pTq, pHandle, &dataRsp, &fetchOffsetNew); #if 1 - if (dataRsp.blockNum == 0 && dataRsp.rspOffset.type == TMQ_OFFSET__LOG && + if (dataRsp.blockNum == 0 && dataRsp.reqOffset.type == TMQ_OFFSET__LOG && dataRsp.reqOffset.version == dataRsp.rspOffset.version) { STqPushEntry* pPushEntry = taosMemoryCalloc(1, sizeof(STqPushEntry)); if (pPushEntry != NULL) { diff --git a/source/libs/executor/src/projectoperator.c b/source/libs/executor/src/projectoperator.c index 8d40824cc4..e9e6fed66a 100644 --- a/source/libs/executor/src/projectoperator.c +++ b/source/libs/executor/src/projectoperator.c @@ -210,9 +210,12 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) { pOperator->status = OP_OPENED; } + qDebug("enter project"); + if (pOperator->status == OP_EXEC_DONE) { if (pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE) { pOperator->status = OP_OPENED; + qDebug("projection in queue model, set status open and return null"); return NULL; } @@ -241,10 +244,13 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) { // The downstream exec may change the value of the newgroup, so use a local variable instead. SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); if (pBlock == NULL) { - if (pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE && pOperator->status == OP_EXEC_RECV && - pFinalRes->info.rows == 0) { + if (pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE && pFinalRes->info.rows == 0) { pOperator->status = OP_OPENED; - continue; + if (pOperator->status == OP_EXEC_RECV) { + continue; + } else { + return NULL; + } } qDebug("set op close, exec %d, status %d rows %d", pTaskInfo->execModel, pOperator->status, pFinalRes->info.rows); From aaf325489be5b4386d749c06f3e90217a08ff259 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Thu, 29 Sep 2022 12:53:06 +0800 Subject: [PATCH 064/143] docs: remove influx_max_line_bytes for 3.0 (#17139) From 768ec8942a8f7bdd6a49a0c3c1d46faa9a680a0d Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 29 Sep 2022 13:23:12 +0800 Subject: [PATCH 065/143] fix code --- source/dnode/vnode/src/tsdb/tsdbCommit.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 99603500ae..8992ee47c4 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -668,7 +668,8 @@ static int32_t tsdbCommitSttBlk(SDataFWriter *pWriter, SDiskDataBuilder *pBuilde .minKey = pBlkInfo->minKey, .maxKey = pBlkInfo->maxKey, .minVer = pBlkInfo->minVer, - .maxVer = pBlkInfo->maxVer}; + .maxVer = pBlkInfo->maxVer, + .nRow = pBuilder->nRow}; // write code = tsdbWriteDiskData(pWriter, pDiskData, &sttBlk.bInfo, NULL); TSDB_CHECK_CODE(code, lino, _exit); From 1d9ed1134f779dd6fa86265618625913eb61ea1e Mon Sep 17 00:00:00 2001 From: afwerar <1296468573@qq.com> Date: Thu, 29 Sep 2022 13:46:37 +0800 Subject: [PATCH 066/143] build: release ver-3.0.1.4 --- cmake/cmake.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/cmake.version b/cmake/cmake.version index 2d86335b3c..05094f10cc 100644 --- a/cmake/cmake.version +++ b/cmake/cmake.version @@ -2,7 +2,7 @@ IF (DEFINED VERNUMBER) SET(TD_VER_NUMBER ${VERNUMBER}) ELSE () - SET(TD_VER_NUMBER "3.0.1.3") + SET(TD_VER_NUMBER "3.0.1.4") ENDIF () IF (DEFINED VERCOMPATIBLE) From 0c48581c86b12ed56e5597165d4dc5d1b2db75c2 Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Thu, 29 Sep 2022 13:52:09 +0800 Subject: [PATCH 067/143] check push ver --- source/dnode/vnode/src/tq/tqPush.c | 5 +++++ tests/script/jenkins/basic.txt | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tq/tqPush.c b/source/dnode/vnode/src/tq/tqPush.c index 4bd47f4e83..dcfb07f0ff 100644 --- a/source/dnode/vnode/src/tq/tqPush.c +++ b/source/dnode/vnode/src/tq/tqPush.c @@ -243,6 +243,11 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) tqDebug("vgId:%d cannot find handle %s", pTq->pVnode->config.vgId, pPushEntry->subKey); continue; } + if (pPushEntry->dataRsp.reqOffset.version > ver) { + tqDebug("vgId:%d push entry req version %ld, while push version %ld, skip", pTq->pVnode->config.vgId, + pPushEntry->dataRsp.reqOffset.version, ver); + continue; + } STqExecHandle* pExec = &pHandle->execHandle; qTaskInfo_t task = pExec->task; diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt index 161c878440..82f73a4fdd 100644 --- a/tests/script/jenkins/basic.txt +++ b/tests/script/jenkins/basic.txt @@ -303,7 +303,7 @@ ./test.sh -f tsim/insert/backquote.sim -m # unsupport ./test.sh -f tsim/parser/fourArithmetic-basic.sim -m ./test.sh -f tsim/query/interval-offset.sim -m -./test.sh -f tsim/tmq/basic3.sim -m +# unsupport ./test.sh -f tsim/tmq/basic3.sim -m ./test.sh -f tsim/stable/vnode3.sim -m ./test.sh -f tsim/qnode/basic1.sim -m # unsupport ./test.sh -f tsim/mnode/basic1.sim -m From b8c088b5f2156773e0e534014e1c73ed9e41aa3b Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Thu, 29 Sep 2022 13:59:37 +0800 Subject: [PATCH 068/143] temporarily disable node case --- tests/docs-examples-test/node.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/docs-examples-test/node.sh b/tests/docs-examples-test/node.sh index 0283904815..41acf7c7b4 100644 --- a/tests/docs-examples-test/node.sh +++ b/tests/docs-examples-test/node.sh @@ -23,7 +23,7 @@ node query_example.js node async_query_example.js -node subscribe_demo.js +# node subscribe_demo.js taos -s "drop topic if exists topic_name_example" taos -s "drop database if exists power" @@ -39,4 +39,4 @@ taos -s "drop database if exists test" node opentsdb_telnet_example.js taos -s "drop database if exists test" -node opentsdb_json_example.js \ No newline at end of file +node opentsdb_json_example.js From ee484470f3946ab9768759e217acb959979cfb8d Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 29 Sep 2022 14:13:44 +0800 Subject: [PATCH 069/143] fix: do not process query and fetch msg until vnode restore finished --- source/dnode/vnode/src/vnd/vnodeSync.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index 2c3808a703..fe13ba303c 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -240,7 +240,7 @@ void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) isWeak, isBlock, msg, numOfMsgs, arrayPos, pMsg->info.handle); if (!pVnode->restored) { - vGError("vgId:%d, msg:%p failed to process since not leader", vgId, pMsg); + vGError("vgId:%d, msg:%p failed to process since restore not finished", vgId, pMsg); terrno = TSDB_CODE_APP_NOT_READY; vnodeHandleProposeError(pVnode, pMsg, TSDB_CODE_APP_NOT_READY); rpcFreeCont(pMsg->pCont); @@ -805,6 +805,12 @@ bool vnodeIsReadyForRead(SVnode *pVnode) { return true; } + if (pVnode->restored) { + vDebug("vgId:%d, vnode not restore finished", pVnode->config.vgId); + terrno = TSDB_CODE_APP_NOT_READY; + return false; + } + vDebug("vgId:%d, vnode not ready for read, state:%s, last:%ld, cmt:%ld", pVnode->config.vgId, syncGetMyRoleStr(pVnode->sync), syncGetLastIndex(pVnode->sync), syncGetCommitIndex(pVnode->sync)); return false; From 4223be379a98facb73063daf4296d576db3fea7d Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 29 Sep 2022 14:15:26 +0800 Subject: [PATCH 070/143] fix: do not process query and fetch msg until vnode restore finished --- source/dnode/vnode/src/vnd/vnodeSync.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index fe13ba303c..f334c47b1b 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -806,7 +806,7 @@ bool vnodeIsReadyForRead(SVnode *pVnode) { } if (pVnode->restored) { - vDebug("vgId:%d, vnode not restore finished", pVnode->config.vgId); + vDebug("vgId:%d, vnode restore not finished", pVnode->config.vgId); terrno = TSDB_CODE_APP_NOT_READY; return false; } From 7e85a15c31cd8b5ae7875cf8d6c26f41f86397c9 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 29 Sep 2022 14:18:20 +0800 Subject: [PATCH 071/143] fix: do not process query and fetch msg until vnode restore finished --- source/dnode/vnode/src/vnd/vnodeSync.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index f334c47b1b..119fa02e05 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -805,7 +805,7 @@ bool vnodeIsReadyForRead(SVnode *pVnode) { return true; } - if (pVnode->restored) { + if (!pVnode->restored) { vDebug("vgId:%d, vnode restore not finished", pVnode->config.vgId); terrno = TSDB_CODE_APP_NOT_READY; return false; From f14d00a5d68074f7c105e45b6263766445bf8316 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 29 Sep 2022 14:19:43 +0800 Subject: [PATCH 072/143] fix: do not process query and fetch msg until vnode restore finished --- source/dnode/vnode/src/vnd/vnodeSync.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index 119fa02e05..e15783d92b 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -797,6 +797,12 @@ bool vnodeIsLeader(SVnode *pVnode) { } bool vnodeIsReadyForRead(SVnode *pVnode) { + if (!pVnode->restored) { + vDebug("vgId:%d, vnode restore not finished", pVnode->config.vgId); + terrno = TSDB_CODE_APP_NOT_READY; + return false; + } + if (syncIsReady(pVnode->sync)) { return true; } @@ -805,12 +811,6 @@ bool vnodeIsReadyForRead(SVnode *pVnode) { return true; } - if (!pVnode->restored) { - vDebug("vgId:%d, vnode restore not finished", pVnode->config.vgId); - terrno = TSDB_CODE_APP_NOT_READY; - return false; - } - vDebug("vgId:%d, vnode not ready for read, state:%s, last:%ld, cmt:%ld", pVnode->config.vgId, syncGetMyRoleStr(pVnode->sync), syncGetLastIndex(pVnode->sync), syncGetCommitIndex(pVnode->sync)); return false; From 4df330351490a5ef867eb73b03f8092e481ecdd1 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 29 Sep 2022 14:24:45 +0800 Subject: [PATCH 073/143] fix: do not process query and fetch msg until vnode restore finished --- source/dnode/vnode/src/vnd/vnodeSync.c | 14 +++----------- source/libs/sync/src/syncMain.c | 5 ++++- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index e15783d92b..a5e2726bbf 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -797,18 +797,10 @@ bool vnodeIsLeader(SVnode *pVnode) { } bool vnodeIsReadyForRead(SVnode *pVnode) { - if (!pVnode->restored) { - vDebug("vgId:%d, vnode restore not finished", pVnode->config.vgId); - terrno = TSDB_CODE_APP_NOT_READY; - return false; - } - - if (syncIsReady(pVnode->sync)) { - return true; - } - if (syncIsReadyForRead(pVnode->sync)) { - return true; + if (pVnode->restored) { + return true; + } } vDebug("vgId:%d, vnode not ready for read, state:%s, last:%ld, cmt:%ld", pVnode->config.vgId, diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 3d79c6c464..dc9bc6cbdc 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -405,7 +405,10 @@ bool syncIsReadyForRead(int64_t rid) { // TODO: last not noop? SyncIndex lastIndex = syncNodeGetLastIndex(pSyncNode); - bool b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && (pSyncNode->commitIndex >= lastIndex - SYNC_MAX_READ_RANGE); + bool b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && pSyncNode->restoreFinish; + if (!b) { + b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && (pSyncNode->commitIndex >= lastIndex - SYNC_MAX_READ_RANGE); + } taosReleaseRef(tsNodeRefId, pSyncNode->rid); // if false, set error code From 586175ecfa6b573df63fe8808ff69cd53f8c013c Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Thu, 29 Sep 2022 14:25:56 +0800 Subject: [PATCH 074/143] check vnode status for poll msg --- source/dnode/vnode/src/vnd/vnodeSvr.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index b62a4dfbdc..1040000363 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -316,6 +316,11 @@ int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo) { return 0; } + if (pMsg->msgType == TDMT_VND_CONSUME && !pVnode->restored) { + vnodeRedirectRpcMsg(pVnode, pMsg); + return 0; + } + char *msgstr = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)); int32_t msgLen = pMsg->contLen - sizeof(SMsgHead); From c56dd863998a4b07d93ac99e340aa46dbebd78aa Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 29 Sep 2022 14:29:30 +0800 Subject: [PATCH 075/143] fix: do not process query and fetch msg until vnode restore finished --- source/dnode/vnode/src/inc/vnd.h | 1 - source/dnode/vnode/src/vnd/vnodeSvr.c | 4 ++-- source/dnode/vnode/src/vnd/vnodeSync.c | 11 ----------- source/libs/sync/src/syncMain.c | 26 -------------------------- 4 files changed, 2 insertions(+), 40 deletions(-) diff --git a/source/dnode/vnode/src/inc/vnd.h b/source/dnode/vnode/src/inc/vnd.h index 898e79928b..900d29b97e 100644 --- a/source/dnode/vnode/src/inc/vnd.h +++ b/source/dnode/vnode/src/inc/vnd.h @@ -99,7 +99,6 @@ void vnodeSyncStart(SVnode* pVnode); void vnodeSyncClose(SVnode* pVnode); void vnodeRedirectRpcMsg(SVnode* pVnode, SRpcMsg* pMsg); bool vnodeIsLeader(SVnode* pVnode); -bool vnodeIsReadyForRead(SVnode* pVnode); bool vnodeIsRoleLeader(SVnode* pVnode); #ifdef __cplusplus diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 6e9eba306a..a9bc3ef875 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -289,7 +289,7 @@ int32_t vnodePreprocessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) { int32_t vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) { vTrace("message in vnode query queue is processing"); - if ((pMsg->msgType == TDMT_SCH_QUERY) && !vnodeIsReadyForRead(pVnode)) { + if ((pMsg->msgType == TDMT_SCH_QUERY) && !vnodeIsLeader(pVnode)) { vnodeRedirectRpcMsg(pVnode, pMsg); return 0; } @@ -311,7 +311,7 @@ int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo) { vTrace("vgId:%d, msg:%p in fetch queue is processing", pVnode->config.vgId, pMsg); if ((pMsg->msgType == TDMT_SCH_FETCH || pMsg->msgType == TDMT_VND_TABLE_META || pMsg->msgType == TDMT_VND_TABLE_CFG || pMsg->msgType == TDMT_VND_BATCH_META) && - !vnodeIsReadyForRead(pVnode)) { + !vnodeIsLeader(pVnode)) { vnodeRedirectRpcMsg(pVnode, pMsg); return 0; } diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index a5e2726bbf..980761cd14 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -796,14 +796,3 @@ bool vnodeIsLeader(SVnode *pVnode) { return true; } -bool vnodeIsReadyForRead(SVnode *pVnode) { - if (syncIsReadyForRead(pVnode->sync)) { - if (pVnode->restored) { - return true; - } - } - - vDebug("vgId:%d, vnode not ready for read, state:%s, last:%ld, cmt:%ld", pVnode->config.vgId, - syncGetMyRoleStr(pVnode->sync), syncGetLastIndex(pVnode->sync), syncGetCommitIndex(pVnode->sync)); - return false; -} diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index dc9bc6cbdc..52feb625a8 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -396,32 +396,6 @@ bool syncIsReady(int64_t rid) { return b; } -bool syncIsReadyForRead(int64_t rid) { - SSyncNode* pSyncNode = (SSyncNode*)taosAcquireRef(tsNodeRefId, rid); - if (pSyncNode == NULL) { - return false; - } - ASSERT(rid == pSyncNode->rid); - - // TODO: last not noop? - SyncIndex lastIndex = syncNodeGetLastIndex(pSyncNode); - bool b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && pSyncNode->restoreFinish; - if (!b) { - b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && (pSyncNode->commitIndex >= lastIndex - SYNC_MAX_READ_RANGE); - } - taosReleaseRef(tsNodeRefId, pSyncNode->rid); - - // if false, set error code - if (false == b) { - if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) { - terrno = TSDB_CODE_SYN_NOT_LEADER; - } else { - terrno = TSDB_CODE_APP_NOT_READY; - } - } - return b; -} - bool syncIsRestoreFinish(int64_t rid) { SSyncNode* pSyncNode = (SSyncNode*)taosAcquireRef(tsNodeRefId, rid); if (pSyncNode == NULL) { From ce087d3dbc8f7b86fe87e1fb36e440800762ef29 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 29 Sep 2022 14:54:58 +0800 Subject: [PATCH 076/143] optimize more code --- source/util/src/tcompression.c | 73 +++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/source/util/src/tcompression.c b/source/util/src/tcompression.c index b19bfbbd43..be220c2585 100644 --- a/source/util/src/tcompression.c +++ b/source/util/src/tcompression.c @@ -1228,6 +1228,7 @@ struct SCompressor { int32_t i_selector; int32_t i_start; int32_t i_end; + int32_t i_nEle; uint64_t i_aZigzag[241]; int8_t i_aBitN[241]; }; @@ -1427,6 +1428,18 @@ static const uint8_t BIT_TO_SELECTOR[] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}; +static const int32_t NEXT_IDX[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 0}; static int32_t tCompIntStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) { int32_t code = 0; @@ -1435,6 +1448,7 @@ static int32_t tCompIntStart(SCompressor *pCmprsor, int8_t type, int8_t cmprAlg) pCmprsor->i_selector = 0; pCmprsor->i_start = 0; pCmprsor->i_end = 0; + pCmprsor->i_nEle = 0; pCmprsor->nBuf = 1; code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf); @@ -1463,11 +1477,12 @@ static int32_t tCompIntSwitchToCopy(SCompressor *pCmprsor) { memcpy(&b, pCmprsor->pBuf + n, sizeof(b)); n += sizeof(b); - int32_t i_selector = (b & 0xf); - int32_t nEle = SELECTOR_TO_ELEMS[i_selector]; - uint8_t bits = BIT_PER_INTEGER[i_selector]; + int32_t i_selector = (b & 0xf); + int32_t nEle = SELECTOR_TO_ELEMS[i_selector]; + uint8_t bits = BIT_PER_INTEGER[i_selector]; + uint64_t mask = (((uint64_t)1) << bits) - 1; for (int32_t iEle = 0; iEle < nEle; iEle++) { - uint64_t vZigzag = (b >> (bits * iEle + 4)) & (((uint64_t)1 << bits) - 1); + uint64_t vZigzag = (b >> (bits * iEle + 4)) & mask; vPrev = ZIGZAG_DECODE(int64_t, vZigzag) + vPrev; DATA_TYPE_INFO[pCmprsor->type].putI64(vPrev, pCmprsor->aBuf[0] + nBuf); @@ -1475,11 +1490,14 @@ static int32_t tCompIntSwitchToCopy(SCompressor *pCmprsor) { } } - for (; pCmprsor->i_start != pCmprsor->i_end; pCmprsor->i_start = (pCmprsor->i_start + 1) % 241) { + while (pCmprsor->i_nEle) { vPrev = ZIGZAG_DECODE(int64_t, pCmprsor->i_aZigzag[pCmprsor->i_start]) + vPrev; memcpy(pCmprsor->aBuf[0] + nBuf, &vPrev, DATA_TYPE_INFO[pCmprsor->type].bytes); nBuf += DATA_TYPE_INFO[pCmprsor->type].bytes; + + pCmprsor->i_start = NEXT_IDX[pCmprsor->i_start]; + pCmprsor->i_nEle--; } ASSERT(n == pCmprsor->nBuf && nBuf == size); @@ -1520,35 +1538,35 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) pCmprsor->i_prev = val; for (;;) { - int32_t nEle = (pCmprsor->i_end + 241 - pCmprsor->i_start) % 241; - - if (nEle + 1 <= SELECTOR_TO_ELEMS[pCmprsor->i_selector] && nEle + 1 <= SELECTOR_TO_ELEMS[BIT_TO_SELECTOR[nBit]]) { + if (pCmprsor->i_nEle + 1 <= SELECTOR_TO_ELEMS[pCmprsor->i_selector] && + pCmprsor->i_nEle + 1 <= SELECTOR_TO_ELEMS[BIT_TO_SELECTOR[nBit]]) { if (pCmprsor->i_selector < BIT_TO_SELECTOR[nBit]) { pCmprsor->i_selector = BIT_TO_SELECTOR[nBit]; } pCmprsor->i_aZigzag[pCmprsor->i_end] = vZigzag; pCmprsor->i_aBitN[pCmprsor->i_end] = nBit; - pCmprsor->i_end = (pCmprsor->i_end + 1) % 241; + pCmprsor->i_end = NEXT_IDX[pCmprsor->i_end]; + pCmprsor->i_nEle++; break; } else { - if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + if (pCmprsor->i_nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { int32_t lidx = pCmprsor->i_selector + 1; int32_t ridx = 15; while (lidx <= ridx) { pCmprsor->i_selector = (lidx + ridx) >> 1; - if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + if (pCmprsor->i_nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { lidx = pCmprsor->i_selector + 1; - } else if (nEle > SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + } else if (pCmprsor->i_nEle > SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { ridx = pCmprsor->i_selector - 1; } else { break; } } - if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) pCmprsor->i_selector++; + if (pCmprsor->i_nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) pCmprsor->i_selector++; } - nEle = SELECTOR_TO_ELEMS[pCmprsor->i_selector]; + int32_t nEle = SELECTOR_TO_ELEMS[pCmprsor->i_selector]; if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + sizeof(uint64_t)))) { return code; @@ -1559,13 +1577,14 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) bp[0] = pCmprsor->i_selector; uint8_t bits = BIT_PER_INTEGER[pCmprsor->i_selector]; for (int32_t iVal = 0; iVal < nEle; iVal++) { - bp[0] |= ((pCmprsor->i_aZigzag[pCmprsor->i_start] & ((((uint64_t)1) << bits) - 1)) << (bits * iVal + 4)); - pCmprsor->i_start = (pCmprsor->i_start + 1) % 241; + bp[0] |= (pCmprsor->i_aZigzag[pCmprsor->i_start] << (bits * iVal + 4)); + pCmprsor->i_start = NEXT_IDX[pCmprsor->i_start]; + pCmprsor->i_nEle--; } // reset and continue pCmprsor->i_selector = 0; - for (int32_t iVal = pCmprsor->i_start; iVal < pCmprsor->i_end; iVal = (iVal + 1) % 241) { + for (int32_t iVal = pCmprsor->i_start; iVal < pCmprsor->i_end; iVal = NEXT_IDX[iVal]) { if (pCmprsor->i_selector < BIT_TO_SELECTOR[pCmprsor->i_aBitN[iVal]]) { pCmprsor->i_selector = BIT_TO_SELECTOR[pCmprsor->i_aBitN[iVal]]; } @@ -1588,28 +1607,25 @@ static int32_t tCompInt(SCompressor *pCmprsor, const void *pData, int32_t nData) static int32_t tCompIntEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_t *nData) { int32_t code = 0; - for (;;) { - int32_t nEle = (pCmprsor->i_end + 241 - pCmprsor->i_start) % 241; - if (nEle == 0) break; - - if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + for (; pCmprsor->i_nEle;) { + if (pCmprsor->i_nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { int32_t lidx = pCmprsor->i_selector + 1; int32_t ridx = 15; while (lidx <= ridx) { pCmprsor->i_selector = (lidx + ridx) >> 1; - if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + if (pCmprsor->i_nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { lidx = pCmprsor->i_selector + 1; - } else if (nEle > SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { + } else if (pCmprsor->i_nEle > SELECTOR_TO_ELEMS[pCmprsor->i_selector]) { ridx = pCmprsor->i_selector - 1; } else { break; } } - if (nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) pCmprsor->i_selector++; + if (pCmprsor->i_nEle < SELECTOR_TO_ELEMS[pCmprsor->i_selector]) pCmprsor->i_selector++; } - nEle = SELECTOR_TO_ELEMS[pCmprsor->i_selector]; + int32_t nEle = SELECTOR_TO_ELEMS[pCmprsor->i_selector]; if (pCmprsor->autoAlloc && (code = tRealloc(&pCmprsor->pBuf, pCmprsor->nBuf + sizeof(uint64_t)))) { return code; @@ -1620,8 +1636,9 @@ static int32_t tCompIntEnd(SCompressor *pCmprsor, const uint8_t **ppData, int32_ bp[0] = pCmprsor->i_selector; uint8_t bits = BIT_PER_INTEGER[pCmprsor->i_selector]; for (int32_t iVal = 0; iVal < nEle; iVal++) { - bp[0] |= ((pCmprsor->i_aZigzag[pCmprsor->i_start] & ((((uint64_t)1) << bits) - 1)) << (bits * iVal + 4)); - pCmprsor->i_start = (pCmprsor->i_start + 1) % 241; + bp[0] |= (pCmprsor->i_aZigzag[pCmprsor->i_start] << (bits * iVal + 4)); + pCmprsor->i_start = NEXT_IDX[pCmprsor->i_start]; + pCmprsor->i_nEle--; } pCmprsor->i_selector = 0; From 6abc13e843bd0be391077a2d730be4a7d9743fa0 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 29 Sep 2022 14:57:15 +0800 Subject: [PATCH 077/143] refactor(query): do some internal refactor. --- source/client/src/clientImpl.c | 3 --- source/client/src/clientMain.c | 2 +- source/libs/catalog/src/ctgAsync.c | 8 +++++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 7852a01bfb..8d5441b847 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -874,8 +874,6 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { STscObj* pTscObj = pRequest->pTscObj; pRequest->code = code; - pRequest->metric.resultReady = taosGetTimestampUs(); - if (pResult) { destroyQueryExecRes(&pRequest->body.resInfo.execRes); memcpy(&pRequest->body.resInfo.execRes, pResult, sizeof(*pResult)); @@ -1059,7 +1057,6 @@ void launchAsyncQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultM } pRequest->metric.planEnd = taosGetTimestampUs(); - if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) { SArray* pNodeList = NULL; buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta); diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index dd2046121e..61fbceb2bc 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -817,7 +817,6 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { pRequest->metric.syntaxEnd = taosGetTimestampUs(); if (!updateMetaForce) { - STscObj *pTscObj = pRequest->pTscObj; SAppClusterSummary *pActivity = &pTscObj->pAppInfo->summary; if (NULL == pRequest->pQuery->pRoot) { atomic_add_fetch_64((int64_t *)&pActivity->numOfInsertsReq, 1); @@ -864,6 +863,7 @@ static void fetchCallback(void *pResult, void *param, int32_t code) { SRequestObj *pRequest = (SRequestObj *)param; SReqResultInfo *pResultInfo = &pRequest->body.resInfo; + pRequest->metric.resultReady = taosGetTimestampUs(); tscDebug("0x%" PRIx64 " enter scheduler fetch cb, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code), pRequest->requestId); diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c index 3c4cc9f7a2..463ea9340a 100644 --- a/source/libs/catalog/src/ctgAsync.c +++ b/source/libs/catalog/src/ctgAsync.c @@ -487,6 +487,8 @@ int32_t ctgInitTask(SCtgJob* pJob, CTG_TASK_TYPE type, void* param, int32_t* tas int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgJob** job, const SCatalogReq* pReq, catalogCallback fp, void* param) { int32_t code = 0; + int64_t st = taosGetTimestampUs(); + int32_t tbMetaNum = (int32_t)ctgGetTablesReqNum(pReq->pTableMeta); int32_t dbVgNum = (int32_t)taosArrayGetSize(pReq->pDbVgroup); int32_t tbHashNum = (int32_t)ctgGetTablesReqNum(pReq->pTableHash); @@ -634,12 +636,12 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgJob** job, const taosAcquireRef(gCtgMgmt.jobPool, pJob->refId); - qDebug("QID:0x%" PRIx64 ", jobId: 0x%" PRIx64 " initialized, task num %d, forceUpdate %d", pJob->queryId, pJob->refId, - taskNum, pReq->forceUpdate); + double el = (taosGetTimestampUs() - st)/1000.0; + qDebug("QID:0x%" PRIx64 ", jobId: 0x%" PRIx64 " initialized, task num %d, forceUpdate %d, elapsed time:%.2f ms", + pJob->queryId, pJob->refId, taskNum, pReq->forceUpdate, el); return TSDB_CODE_SUCCESS; _return: - ctgFreeJob(*job); CTG_RET(code); } From 73642ac3a2e5e63a2821aecd97b2bcf2648be3f5 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Thu, 29 Sep 2022 16:16:49 +0800 Subject: [PATCH 078/143] feat: sql command 'show table tags from table_name' --- include/common/ttokendef.h | 209 +- include/libs/function/functionMgt.h | 1 + include/libs/nodes/nodes.h | 8 +- include/util/taoserror.h | 1 + source/libs/function/src/builtins.c | 15 + source/libs/nodes/src/nodesUtilFuncs.c | 4 +- source/libs/parser/inc/sql.y | 2 + source/libs/parser/src/parAstCreater.c | 2 +- source/libs/parser/src/parAstParser.c | 7 + source/libs/parser/src/parTokenizer.c | 1 + source/libs/parser/src/parTranslater.c | 136 +- source/libs/parser/src/sql.c | 5639 ++++++++++---------- source/libs/planner/test/planBasicTest.cpp | 2 + source/libs/planner/test/planOtherTest.cpp | 2 + 14 files changed, 3087 insertions(+), 2942 deletions(-) diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index 94128a4999..d061da7aaf 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -227,110 +227,111 @@ #define TK_WEND 209 #define TK_WDURATION 210 #define TK_IROWTS 211 -#define TK_CAST 212 -#define TK_NOW 213 -#define TK_TODAY 214 -#define TK_TIMEZONE 215 -#define TK_CLIENT_VERSION 216 -#define TK_SERVER_VERSION 217 -#define TK_SERVER_STATUS 218 -#define TK_CURRENT_USER 219 -#define TK_COUNT 220 -#define TK_LAST_ROW 221 -#define TK_CASE 222 -#define TK_END 223 -#define TK_WHEN 224 -#define TK_THEN 225 -#define TK_ELSE 226 -#define TK_BETWEEN 227 -#define TK_IS 228 -#define TK_NK_LT 229 -#define TK_NK_GT 230 -#define TK_NK_LE 231 -#define TK_NK_GE 232 -#define TK_NK_NE 233 -#define TK_MATCH 234 -#define TK_NMATCH 235 -#define TK_CONTAINS 236 -#define TK_IN 237 -#define TK_JOIN 238 -#define TK_INNER 239 -#define TK_SELECT 240 -#define TK_DISTINCT 241 -#define TK_WHERE 242 -#define TK_PARTITION 243 -#define TK_BY 244 -#define TK_SESSION 245 -#define TK_STATE_WINDOW 246 -#define TK_SLIDING 247 -#define TK_FILL 248 -#define TK_VALUE 249 -#define TK_NONE 250 -#define TK_PREV 251 -#define TK_LINEAR 252 -#define TK_NEXT 253 -#define TK_HAVING 254 -#define TK_RANGE 255 -#define TK_EVERY 256 -#define TK_ORDER 257 -#define TK_SLIMIT 258 -#define TK_SOFFSET 259 -#define TK_LIMIT 260 -#define TK_OFFSET 261 -#define TK_ASC 262 -#define TK_NULLS 263 -#define TK_ABORT 264 -#define TK_AFTER 265 -#define TK_ATTACH 266 -#define TK_BEFORE 267 -#define TK_BEGIN 268 -#define TK_BITAND 269 -#define TK_BITNOT 270 -#define TK_BITOR 271 -#define TK_BLOCKS 272 -#define TK_CHANGE 273 -#define TK_COMMA 274 -#define TK_COMPACT 275 -#define TK_CONCAT 276 -#define TK_CONFLICT 277 -#define TK_COPY 278 -#define TK_DEFERRED 279 -#define TK_DELIMITERS 280 -#define TK_DETACH 281 -#define TK_DIVIDE 282 -#define TK_DOT 283 -#define TK_EACH 284 -#define TK_FAIL 285 -#define TK_FILE 286 -#define TK_FOR 287 -#define TK_GLOB 288 -#define TK_ID 289 -#define TK_IMMEDIATE 290 -#define TK_IMPORT 291 -#define TK_INITIALLY 292 -#define TK_INSTEAD 293 -#define TK_ISNULL 294 -#define TK_KEY 295 -#define TK_NK_BITNOT 296 -#define TK_NK_SEMI 297 -#define TK_NOTNULL 298 -#define TK_OF 299 -#define TK_PLUS 300 -#define TK_PRIVILEGE 301 -#define TK_RAISE 302 -#define TK_REPLACE 303 -#define TK_RESTRICT 304 -#define TK_ROW 305 -#define TK_SEMI 306 -#define TK_STAR 307 -#define TK_STATEMENT 308 -#define TK_STRING 309 -#define TK_TIMES 310 -#define TK_UPDATE 311 -#define TK_VALUES 312 -#define TK_VARIABLE 313 -#define TK_VIEW 314 -#define TK_WAL 315 +#define TK_QTAGS 212 +#define TK_CAST 213 +#define TK_NOW 214 +#define TK_TODAY 215 +#define TK_TIMEZONE 216 +#define TK_CLIENT_VERSION 217 +#define TK_SERVER_VERSION 218 +#define TK_SERVER_STATUS 219 +#define TK_CURRENT_USER 220 +#define TK_COUNT 221 +#define TK_LAST_ROW 222 +#define TK_CASE 223 +#define TK_END 224 +#define TK_WHEN 225 +#define TK_THEN 226 +#define TK_ELSE 227 +#define TK_BETWEEN 228 +#define TK_IS 229 +#define TK_NK_LT 230 +#define TK_NK_GT 231 +#define TK_NK_LE 232 +#define TK_NK_GE 233 +#define TK_NK_NE 234 +#define TK_MATCH 235 +#define TK_NMATCH 236 +#define TK_CONTAINS 237 +#define TK_IN 238 +#define TK_JOIN 239 +#define TK_INNER 240 +#define TK_SELECT 241 +#define TK_DISTINCT 242 +#define TK_WHERE 243 +#define TK_PARTITION 244 +#define TK_BY 245 +#define TK_SESSION 246 +#define TK_STATE_WINDOW 247 +#define TK_SLIDING 248 +#define TK_FILL 249 +#define TK_VALUE 250 +#define TK_NONE 251 +#define TK_PREV 252 +#define TK_LINEAR 253 +#define TK_NEXT 254 +#define TK_HAVING 255 +#define TK_RANGE 256 +#define TK_EVERY 257 +#define TK_ORDER 258 +#define TK_SLIMIT 259 +#define TK_SOFFSET 260 +#define TK_LIMIT 261 +#define TK_OFFSET 262 +#define TK_ASC 263 +#define TK_NULLS 264 +#define TK_ABORT 265 +#define TK_AFTER 266 +#define TK_ATTACH 267 +#define TK_BEFORE 268 +#define TK_BEGIN 269 +#define TK_BITAND 270 +#define TK_BITNOT 271 +#define TK_BITOR 272 +#define TK_BLOCKS 273 +#define TK_CHANGE 274 +#define TK_COMMA 275 +#define TK_COMPACT 276 +#define TK_CONCAT 277 +#define TK_CONFLICT 278 +#define TK_COPY 279 +#define TK_DEFERRED 280 +#define TK_DELIMITERS 281 +#define TK_DETACH 282 +#define TK_DIVIDE 283 +#define TK_DOT 284 +#define TK_EACH 285 +#define TK_FAIL 286 +#define TK_FILE 287 +#define TK_FOR 288 +#define TK_GLOB 289 +#define TK_ID 290 +#define TK_IMMEDIATE 291 +#define TK_IMPORT 292 +#define TK_INITIALLY 293 +#define TK_INSTEAD 294 +#define TK_ISNULL 295 +#define TK_KEY 296 +#define TK_NK_BITNOT 297 +#define TK_NK_SEMI 298 +#define TK_NOTNULL 299 +#define TK_OF 300 +#define TK_PLUS 301 +#define TK_PRIVILEGE 302 +#define TK_RAISE 303 +#define TK_REPLACE 304 +#define TK_RESTRICT 305 +#define TK_ROW 306 +#define TK_SEMI 307 +#define TK_STAR 308 +#define TK_STATEMENT 309 +#define TK_STRING 310 +#define TK_TIMES 311 +#define TK_UPDATE 312 +#define TK_VALUES 313 +#define TK_VARIABLE 314 +#define TK_VIEW 315 +#define TK_WAL 316 #define TK_NK_SPACE 300 #define TK_NK_COMMENT 301 diff --git a/include/libs/function/functionMgt.h b/include/libs/function/functionMgt.h index cb4960707b..569c16675d 100644 --- a/include/libs/function/functionMgt.h +++ b/include/libs/function/functionMgt.h @@ -120,6 +120,7 @@ typedef enum EFunctionType { FUNCTION_TYPE_WEND, FUNCTION_TYPE_WDURATION, FUNCTION_TYPE_IROWTS, + FUNCTION_TYPE_TAGS, // internal function FUNCTION_TYPE_SELECT_VALUE = 3750, diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h index 560832cd74..00e896f586 100644 --- a/include/libs/nodes/nodes.h +++ b/include/libs/nodes/nodes.h @@ -27,9 +27,10 @@ extern "C" { #define LIST_LENGTH(l) (NULL != (l) ? (l)->length : 0) -#define FOREACH(node, list) \ - for (SListCell *cell = (NULL != (list) ? (list)->pHead : NULL), *pNext; \ - (NULL != cell ? (node = cell->pNode, pNext = cell->pNext, true) : (node = NULL, pNext = NULL, false)); cell = pNext) +#define FOREACH(node, list) \ + for (SListCell* cell = (NULL != (list) ? (list)->pHead : NULL), *pNext; \ + (NULL != cell ? (node = cell->pNode, pNext = cell->pNext, true) : (node = NULL, pNext = NULL, false)); \ + cell = pNext) #define REPLACE_NODE(newNode) cell->pNode = (SNode*)(newNode) @@ -192,6 +193,7 @@ typedef enum ENodeType { QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT, QUERY_NODE_SHOW_SCORES_STMT, + QUERY_NODE_SHOW_TABLE_TAGS_STMT, QUERY_NODE_KILL_CONNECTION_STMT, QUERY_NODE_KILL_QUERY_STMT, QUERY_NODE_KILL_TRANSACTION_STMT, diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 837d0c6303..f6940b2895 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -565,6 +565,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_PAR_GET_META_ERROR TAOS_DEF_ERROR_CODE(0, 0x2662) #define TSDB_CODE_PAR_NOT_UNIQUE_TABLE_ALIAS TAOS_DEF_ERROR_CODE(0, 0x2663) #define TSDB_CODE_PAR_NOT_SUPPORT_JOIN TAOS_DEF_ERROR_CODE(0, 0x2664) +#define TSDB_CODE_PAR_INVALID_TAGS_PC TAOS_DEF_ERROR_CODE(0, 0x2665) #define TSDB_CODE_PAR_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x26FF) //planner diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c index 54455415b8..e9415dc879 100644 --- a/source/libs/function/src/builtins.c +++ b/source/libs/function/src/builtins.c @@ -2020,6 +2020,11 @@ static int32_t translateUserFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t le return TSDB_CODE_SUCCESS; } +static int32_t translateTagsPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { + // The _tags pseudo-column will be expanded to the actual tags on the client side + return TSDB_CODE_SUCCESS; +} + // clang-format off const SBuiltinFuncDefinition funcMgtBuiltins[] = { { @@ -3156,6 +3161,16 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = { .sprocessFunc = NULL, .finalizeFunc = NULL }, + { + .name = "_tags", + .type = FUNCTION_TYPE_TAGS, + .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_MULTI_RES_FUNC, + .translateFunc = translateTagsPseudoColumn, + .getEnvFunc = NULL, + .initFunc = NULL, + .sprocessFunc = NULL, + .finalizeFunc = NULL + }, }; // clang-format on diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index f8dda501e9..6e964fb53a 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -419,6 +419,7 @@ SNode* nodesMakeNode(ENodeType type) { case QUERY_NODE_SHOW_TRANSACTIONS_STMT: case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT: case QUERY_NODE_SHOW_TAGS_STMT: + case QUERY_NODE_SHOW_TABLE_TAGS_STMT: return makeNode(type, sizeof(SShowStmt)); case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT: return makeNode(type, sizeof(SShowDnodeVariablesStmt)); @@ -921,7 +922,8 @@ void nodesDestroyNode(SNode* pNode) { case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT: case QUERY_NODE_SHOW_TRANSACTIONS_STMT: case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT: - case QUERY_NODE_SHOW_TAGS_STMT: { + case QUERY_NODE_SHOW_TAGS_STMT: + case QUERY_NODE_SHOW_TABLE_TAGS_STMT: { SShowStmt* pStmt = (SShowStmt*)pNode; nodesDestroyNode(pStmt->pDbName); nodesDestroyNode(pStmt->pTbName); diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 225f169289..83fa92041e 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -420,6 +420,7 @@ cmd ::= SHOW TABLE DISTRIBUTED full_table_name(A). cmd ::= SHOW CONSUMERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } cmd ::= SHOW SUBSCRIPTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } cmd ::= SHOW TAGS FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, B, A, OP_TYPE_EQUAL); } +cmd ::= SHOW TABLE TAGS FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLE_TAGS_STMT, B, A, OP_TYPE_EQUAL); } cmd ::= SHOW VNODES NK_INTEGER(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A), NULL); } cmd ::= SHOW VNODES NK_STRING(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &A)); } @@ -708,6 +709,7 @@ pseudo_column(A) ::= WSTART(B). pseudo_column(A) ::= WEND(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); } pseudo_column(A) ::= WDURATION(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); } pseudo_column(A) ::= IROWTS(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); } +pseudo_column(A) ::= QTAGS(B). { A = createRawExprNode(pCxt, &B, createFunctionNode(pCxt, &B, NULL)); } function_expression(A) ::= function_name(B) NK_LP expression_list(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, C)); } function_expression(A) ::= star_func(B) NK_LP star_func_para_list(C) NK_RP(D). { A = createRawExprNodeExt(pCxt, &B, &D, createFunctionNode(pCxt, &B, C)); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 10a066db40..8998ffdbf3 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -1310,7 +1310,7 @@ SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) { static bool needDbShowStmt(ENodeType type) { return QUERY_NODE_SHOW_TABLES_STMT == type || QUERY_NODE_SHOW_STABLES_STMT == type || QUERY_NODE_SHOW_VGROUPS_STMT == type || QUERY_NODE_SHOW_INDEXES_STMT == type || - QUERY_NODE_SHOW_TAGS_STMT == type; + QUERY_NODE_SHOW_TAGS_STMT == type || QUERY_NODE_SHOW_TABLE_TAGS_STMT == type; } SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type) { diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c index 968e03f97e..ce90bd3da0 100644 --- a/source/libs/parser/src/parAstParser.c +++ b/source/libs/parser/src/parAstParser.c @@ -414,6 +414,11 @@ static int32_t collectMetaKeyFromShowTags(SCollectMetaKeyCxt* pCxt, SShowStmt* p return code; } +static int32_t collectMetaKeyFromShowStableTags(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) { + return collectMetaKeyFromRealTableImpl(pCxt, ((SValueNode*)pStmt->pDbName)->literal, + ((SValueNode*)pStmt->pTbName)->literal, AUTH_TYPE_READ); +} + static int32_t collectMetaKeyFromShowUsers(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) { return reserveTableMetaInCache(pCxt->pParseCxt->acctId, TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USERS, pCxt->pMetaCache); @@ -595,6 +600,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) { return collectMetaKeyFromShowTables(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_TAGS_STMT: return collectMetaKeyFromShowTags(pCxt, (SShowStmt*)pStmt); + case QUERY_NODE_SHOW_TABLE_TAGS_STMT: + return collectMetaKeyFromShowStableTags(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_USERS_STMT: return collectMetaKeyFromShowUsers(pCxt, (SShowStmt*)pStmt); case QUERY_NODE_SHOW_LICENCES_STMT: diff --git a/source/libs/parser/src/parTokenizer.c b/source/libs/parser/src/parTokenizer.c index 64510773a2..345b9cc5b9 100644 --- a/source/libs/parser/src/parTokenizer.c +++ b/source/libs/parser/src/parTokenizer.c @@ -257,6 +257,7 @@ static SKeyword keywordTable[] = { {"_QEND", TK_QEND}, {"_QSTART", TK_QSTART}, {"_ROWTS", TK_ROWTS}, + {"_TAGS", TK_QTAGS}, {"_WDURATION", TK_WDURATION}, {"_WEND", TK_WEND}, {"_WSTART", TK_WSTART}, diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index eb63630dbf..9d805b8e33 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -1215,6 +1215,9 @@ static bool isMultiResFunc(SNode* pNode) { if (QUERY_NODE_FUNCTION != nodeType(pNode) || !fmIsMultiResFunc(((SFunctionNode*)pNode)->funcId)) { return false; } + if (FUNCTION_TYPE_TAGS == ((SFunctionNode*)pNode)->funcType) { + return true; + } SNodeList* pParameterList = ((SFunctionNode*)pNode)->pParameterList; if (LIST_LENGTH(pParameterList) > 1) { return true; @@ -1556,7 +1559,7 @@ static int32_t translateMultiResFunc(STranslateContext* pCxt, SFunctionNode* pFu "%s(*) is only supported in SELECTed list", pFunc->functionName); } } - if (tsKeepColumnName) { + if (tsKeepColumnName && 1 == LIST_LENGTH(pFunc->pParameterList)) { strcpy(pFunc->node.userAlias, ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->userAlias); } return TSDB_CODE_SUCCESS; @@ -1842,17 +1845,46 @@ static EDealRes translateWhenThen(STranslateContext* pCxt, SWhenThenNode* pWhenT return DEAL_RES_CONTINUE; } +static bool isCondition(const SNode* pNode) { + if (QUERY_NODE_OPERATOR == nodeType(pNode)) { + return nodesIsComparisonOp((const SOperatorNode*)pNode); + } + return (QUERY_NODE_LOGIC_CONDITION == nodeType(pNode)); +} + +static int32_t rewriteIsTrue(SNode* pSrc, SNode** pIsTrue) { + SOperatorNode* pOp = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); + if (NULL == pOp) { + return TSDB_CODE_OUT_OF_MEMORY; + } + pOp->opType = OP_TYPE_IS_TRUE; + pOp->pLeft = pSrc; + pOp->node.resType.type = TSDB_DATA_TYPE_BOOL; + pOp->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; + *pIsTrue = (SNode*)pOp; + return TSDB_CODE_SUCCESS; +} + static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseWhen) { bool first = true; SNode* pNode = NULL; FOREACH(pNode, pCaseWhen->pWhenThenList) { + SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode; + if (NULL == pCaseWhen->pCase && !isCondition(pWhenThen->pWhen)) { + SNode* pIsTrue = NULL; + pCxt->errCode = rewriteIsTrue(pWhenThen->pWhen, &pIsTrue); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + return DEAL_RES_ERROR; + } + pWhenThen->pWhen = pIsTrue; + } if (first) { pCaseWhen->node.resType = ((SExprNode*)pNode)->resType; } else if (!dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType)) { - SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode; - SNode* pCastFunc = NULL; - if (TSDB_CODE_SUCCESS != createCastFunc(pCxt, pWhenThen->pThen, pCaseWhen->node.resType, &pCastFunc)) { - return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "CASE WHEN data type mismatch"); + SNode* pCastFunc = NULL; + pCxt->errCode = createCastFunc(pCxt, pWhenThen->pThen, pCaseWhen->node.resType, &pCastFunc); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + return DEAL_RES_ERROR; } pWhenThen->pThen = pCastFunc; pWhenThen->node.resType = pCaseWhen->node.resType; @@ -1860,8 +1892,9 @@ static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseW } if (NULL != pCaseWhen->pElse && !dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pCaseWhen->pElse)->resType)) { SNode* pCastFunc = NULL; - if (TSDB_CODE_SUCCESS != createCastFunc(pCxt, pCaseWhen->pElse, pCaseWhen->node.resType, &pCastFunc)) { - return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "CASE WHEN data type mismatch"); + pCxt->errCode = createCastFunc(pCxt, pCaseWhen->pElse, pCaseWhen->node.resType, &pCastFunc); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + return DEAL_RES_ERROR; } pCaseWhen->pElse = pCastFunc; ((SExprNode*)pCaseWhen->pElse)->resType = pCaseWhen->node.resType; @@ -2585,6 +2618,34 @@ static int32_t createMultiResFuncsFromStar(STranslateContext* pCxt, SFunctionNod return code; } +static int32_t createTags(STranslateContext* pCxt, SNodeList** pOutput) { + if (QUERY_NODE_REAL_TABLE != nodeType(((SSelectStmt*)pCxt->pCurrStmt)->pFromTable)) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TAGS_PC, + "The _TAGS pseudo column can only be used for subtable and supertable queries"); + } + + SRealTableNode* pTable = (SRealTableNode*)(((SSelectStmt*)pCxt->pCurrStmt)->pFromTable); + const STableMeta* pMeta = pTable->pMeta; + if (TSDB_SUPER_TABLE != pMeta->tableType && TSDB_CHILD_TABLE != pMeta->tableType) { + return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_TAGS_PC, + "The _TAGS pseudo column can only be used for subtable and supertable queries"); + } + + SSchema* pTagsSchema = getTableTagSchema(pMeta); + for (int32_t i = 0; i < pMeta->tableInfo.numOfTags; ++i) { + SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + if (NULL == pCol) { + return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY); + } + setColumnInfoBySchema(pTable, pTagsSchema + i, 1, pCol); + if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(pOutput, (SNode*)pCol)) { + NODES_DESTORY_LIST(*pOutput); + return TSDB_CODE_OUT_OF_MEMORY; + } + } + return TSDB_CODE_SUCCESS; +} + static int32_t translateStar(STranslateContext* pCxt, SSelectStmt* pSelect) { SNode* pNode = NULL; WHERE_EACH(pNode, pSelect->pProjectionList) { @@ -2598,10 +2659,14 @@ static int32_t translateStar(STranslateContext* pCxt, SSelectStmt* pSelect) { continue; } } else if (isMultiResFunc(pNode)) { - SNodeList* pFuncs = NULL; - code = createMultiResFuncsFromStar(pCxt, (SFunctionNode*)pNode, &pFuncs); + SNodeList* pNodeList = NULL; + if (FUNCTION_TYPE_TAGS == ((SFunctionNode*)pNode)->funcType) { + code = createTags(pCxt, &pNodeList); + } else { + code = createMultiResFuncsFromStar(pCxt, (SFunctionNode*)pNode, &pNodeList); + } if (TSDB_CODE_SUCCESS == code) { - INSERT_LIST(pSelect->pProjectionList, pFuncs); + INSERT_LIST(pSelect->pProjectionList, pNodeList); ERASE_NODE(pSelect->pProjectionList); continue; } @@ -4579,6 +4644,8 @@ static SNode* createTbnameFunction() { return NULL; } strcpy(pFunc->functionName, "tbname"); + strcpy(pFunc->node.aliasName, "tbname"); + strcpy(pFunc->node.userAlias, "tbname"); return (SNode*)pFunc; } @@ -6007,7 +6074,7 @@ static SNode* createProjectCol(const char* pProjCol) { static SNodeList* createProjectCols(int32_t ncols, const char* const pCols[]) { SNodeList* pProjections = NULL; - if (ncols <= 0) { + if (0 == ncols) { nodesListMakeStrictAppend(&pProjections, createStarCol()); return pProjections; } @@ -6039,10 +6106,12 @@ static int32_t createSimpleSelectStmt(const char* pDb, const char* pTable, int32 strcpy(pRealTable->table.tableAlias, pTable); pSelect->pFromTable = (SNode*)pRealTable; - pSelect->pProjectionList = createProjectCols(numOfProjs, pProjCol); - if (NULL == pSelect->pProjectionList) { - nodesDestroyNode((SNode*)pSelect); - return TSDB_CODE_OUT_OF_MEMORY; + if (numOfProjs >= 0) { + pSelect->pProjectionList = createProjectCols(numOfProjs, pProjCol); + if (NULL == pSelect->pProjectionList) { + nodesDestroyNode((SNode*)pSelect); + return TSDB_CODE_OUT_OF_MEMORY; + } } *pStmt = pSelect; @@ -6145,6 +6214,40 @@ static int32_t rewriteShow(STranslateContext* pCxt, SQuery* pQuery) { pQuery->showRewrite = true; nodesDestroyNode(pQuery->pRoot); pQuery->pRoot = (SNode*)pStmt; + } else { + nodesDestroyNode((SNode*)pStmt); + } + return code; +} + +static SNode* createTagsFunction() { + SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + if (NULL == pFunc) { + return NULL; + } + strcpy(pFunc->functionName, "_tags"); + return (SNode*)pFunc; +} + +static int32_t rewriteShowStableTags(STranslateContext* pCxt, SQuery* pQuery) { + const char* cols[] = {"tbname", "_tags"}; + SShowStmt* pShow = (SShowStmt*)pQuery->pRoot; + SSelectStmt* pSelect = NULL; + int32_t code = createSimpleSelectStmt(((SValueNode*)pShow->pDbName)->literal, ((SValueNode*)pShow->pTbName)->literal, + -1, NULL, &pSelect); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pSelect->pProjectionList, createTbnameFunction()); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pSelect->pProjectionList, createTagsFunction()); + } + if (TSDB_CODE_SUCCESS == code) { + pSelect->isDistinct = true; + pQuery->showRewrite = true; + nodesDestroyNode(pQuery->pRoot); + pQuery->pRoot = (SNode*)pSelect; + } else { + nodesDestroyNode((SNode*)pSelect); } return code; } @@ -7282,6 +7385,9 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) { case QUERY_NODE_SHOW_TAGS_STMT: code = rewriteShow(pCxt, pQuery); break; + case QUERY_NODE_SHOW_TABLE_TAGS_STMT: + code = rewriteShowStableTags(pCxt, pQuery); + break; case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT: code = rewriteShowDnodeVariables(pCxt, pQuery); break; diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index 9acf6ffcdd..9711aed4ba 100644 --- a/source/libs/parser/src/sql.c +++ b/source/libs/parser/src/sql.c @@ -104,26 +104,26 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int -#define YYNOCODE 448 +#define YYNOCODE 449 #define YYACTIONTYPE unsigned short int #define ParseTOKENTYPE SToken typedef union { int yyinit; ParseTOKENTYPE yy0; - bool yy89; - EFillMode yy102; - SNodeList* yy152; - int64_t yy221; - EOperatorType yy380; - EOrder yy386; - int8_t yy439; - int32_t yy452; - ENullOrder yy585; - EJoinType yy596; - SNode* yy616; - SAlterOption yy669; - SToken yy673; - SDataType yy784; + EOrder yy14; + bool yy39; + SToken yy181; + EJoinType yy202; + int32_t yy276; + SNodeList* yy282; + int8_t yy293; + ENullOrder yy305; + SDataType yy380; + EFillMode yy381; + SAlterOption yy645; + EOperatorType yy682; + SNode* yy778; + int64_t yy831; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -139,17 +139,17 @@ typedef union { #define ParseCTX_FETCH #define ParseCTX_STORE #define YYFALLBACK 1 -#define YYNSTATE 689 -#define YYNRULE 519 -#define YYNTOKEN 316 -#define YY_MAX_SHIFT 688 -#define YY_MIN_SHIFTREDUCE 1017 -#define YY_MAX_SHIFTREDUCE 1535 -#define YY_ERROR_ACTION 1536 -#define YY_ACCEPT_ACTION 1537 -#define YY_NO_ACTION 1538 -#define YY_MIN_REDUCE 1539 -#define YY_MAX_REDUCE 2057 +#define YYNSTATE 693 +#define YYNRULE 521 +#define YYNTOKEN 317 +#define YY_MAX_SHIFT 692 +#define YY_MIN_SHIFTREDUCE 1022 +#define YY_MAX_SHIFTREDUCE 1542 +#define YY_ERROR_ACTION 1543 +#define YY_ACCEPT_ACTION 1544 +#define YY_NO_ACTION 1545 +#define YY_MIN_REDUCE 1546 +#define YY_MAX_REDUCE 2066 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -216,798 +216,791 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (3046) +#define YY_ACTTAB_COUNT (2993) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 1860, 1789, 443, 1860, 444, 1574, 451, 1874, 444, 1574, - /* 10 */ 1677, 1856, 44, 42, 1856, 351, 540, 1675, 1731, 1733, - /* 20 */ 346, 1856, 1317, 43, 41, 40, 39, 38, 52, 2033, - /* 30 */ 40, 39, 38, 1396, 1050, 1315, 1892, 1852, 1858, 334, - /* 40 */ 1852, 1858, 340, 1343, 582, 1686, 1344, 1852, 1858, 1842, - /* 50 */ 588, 594, 30, 588, 442, 581, 1391, 446, 37, 36, - /* 60 */ 588, 17, 43, 41, 40, 39, 38, 1874, 1323, 44, - /* 70 */ 42, 1466, 1872, 1130, 1054, 1055, 1907, 346, 566, 1317, - /* 80 */ 97, 1873, 1875, 598, 1877, 1878, 593, 1067, 588, 1066, - /* 90 */ 1396, 1562, 1315, 167, 1, 1960, 1892, 1732, 1733, 339, - /* 100 */ 1956, 77, 479, 1738, 595, 578, 1132, 2028, 1470, 1842, - /* 110 */ 333, 594, 172, 1391, 1342, 125, 685, 1068, 17, 1736, - /* 120 */ 1986, 1525, 565, 170, 1681, 1323, 1663, 2029, 567, 46, - /* 130 */ 1398, 1399, 596, 1842, 132, 62, 1907, 1540, 1561, 225, - /* 140 */ 98, 345, 1875, 598, 1877, 1878, 593, 1975, 588, 1892, - /* 150 */ 87, 1, 581, 1212, 1213, 1960, 58, 560, 109, 312, - /* 160 */ 1956, 108, 107, 106, 105, 104, 103, 102, 101, 100, - /* 170 */ 2028, 130, 1679, 685, 527, 1972, 1318, 58, 1316, 81, - /* 180 */ 1842, 331, 34, 265, 1786, 565, 170, 1398, 1399, 264, - /* 190 */ 2029, 567, 580, 168, 1968, 1969, 559, 1973, 556, 450, - /* 200 */ 1321, 1322, 446, 1372, 1373, 1375, 1376, 1377, 1378, 1379, - /* 210 */ 1380, 1381, 590, 586, 1389, 1390, 1392, 1393, 1394, 1395, - /* 220 */ 1397, 1400, 3, 581, 203, 58, 46, 94, 1427, 155, - /* 230 */ 578, 1551, 629, 1318, 1342, 1316, 58, 384, 160, 383, - /* 240 */ 173, 127, 1492, 477, 473, 469, 465, 202, 428, 1678, - /* 250 */ 448, 144, 143, 626, 625, 624, 1340, 1321, 1322, 132, - /* 260 */ 1372, 1373, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 590, - /* 270 */ 586, 1389, 1390, 1392, 1393, 1394, 1395, 1397, 1400, 3, - /* 280 */ 44, 42, 562, 557, 78, 490, 489, 200, 346, 1861, - /* 290 */ 1317, 553, 1490, 1491, 1493, 1494, 130, 31, 1374, 578, - /* 300 */ 1856, 1396, 173, 1315, 183, 182, 109, 1432, 58, 108, - /* 310 */ 107, 106, 105, 104, 103, 102, 101, 100, 169, 1968, - /* 320 */ 1969, 629, 1973, 173, 1391, 460, 1852, 1858, 132, 17, - /* 330 */ 2033, 11, 1874, 9, 540, 380, 1323, 44, 42, 588, - /* 340 */ 144, 143, 626, 625, 624, 346, 175, 1317, 578, 158, - /* 350 */ 199, 193, 47, 198, 1643, 382, 378, 456, 1396, 2028, - /* 360 */ 1315, 1892, 1, 1686, 1343, 130, 540, 2033, 542, 582, - /* 370 */ 1932, 173, 173, 191, 1842, 2032, 594, 132, 119, 2029, - /* 380 */ 2031, 1391, 173, 391, 685, 481, 17, 171, 1968, 1969, - /* 390 */ 217, 1973, 1067, 1323, 1066, 1686, 2028, 1872, 1398, 1399, - /* 400 */ 1342, 1907, 1539, 231, 232, 97, 1873, 1875, 598, 1877, - /* 410 */ 1878, 593, 2032, 588, 121, 561, 2029, 2030, 167, 1, - /* 420 */ 1960, 308, 1068, 540, 339, 1956, 118, 117, 116, 115, - /* 430 */ 114, 113, 112, 111, 110, 119, 262, 1968, 577, 1975, - /* 440 */ 576, 685, 486, 2028, 1318, 1987, 1316, 79, 310, 631, - /* 450 */ 1738, 530, 1686, 1341, 173, 1398, 1399, 350, 565, 170, - /* 460 */ 13, 12, 310, 2029, 567, 530, 1736, 1971, 1321, 1322, - /* 470 */ 1661, 1372, 1373, 1375, 1376, 1377, 1378, 1379, 1380, 1381, - /* 480 */ 590, 586, 1389, 1390, 1392, 1393, 1394, 1395, 1397, 1400, - /* 490 */ 3, 230, 11, 1406, 544, 1537, 1932, 322, 173, 1342, - /* 500 */ 77, 1318, 1785, 1316, 305, 1170, 620, 619, 618, 1174, - /* 510 */ 617, 1176, 1177, 616, 1179, 613, 142, 1185, 610, 1187, - /* 520 */ 1188, 607, 604, 1682, 623, 1321, 1322, 179, 1372, 1373, - /* 530 */ 1375, 1376, 1377, 1378, 1379, 1380, 1381, 590, 586, 1389, - /* 540 */ 1390, 1392, 1393, 1394, 1395, 1397, 1400, 3, 44, 42, - /* 550 */ 392, 1295, 1296, 332, 1439, 361, 346, 323, 1317, 321, - /* 560 */ 320, 153, 483, 393, 74, 540, 485, 73, 51, 1396, - /* 570 */ 1688, 1315, 523, 1664, 385, 1975, 629, 389, 37, 36, - /* 580 */ 166, 1874, 43, 41, 40, 39, 38, 1344, 484, 11, - /* 590 */ 1345, 523, 1391, 1725, 1686, 144, 143, 626, 625, 624, - /* 600 */ 1874, 2028, 540, 1970, 1323, 44, 42, 1401, 656, 654, - /* 610 */ 1892, 1560, 1323, 346, 390, 1317, 2034, 170, 595, 643, - /* 620 */ 2028, 2029, 567, 1842, 224, 594, 1396, 1738, 1315, 1892, - /* 630 */ 8, 1686, 507, 460, 317, 2034, 170, 595, 2032, 540, - /* 640 */ 2029, 567, 1842, 1736, 594, 505, 596, 503, 1662, 1391, - /* 650 */ 1907, 398, 685, 1842, 292, 345, 1875, 598, 1877, 1878, - /* 660 */ 593, 1323, 588, 349, 80, 1872, 1398, 1399, 1686, 1907, - /* 670 */ 1671, 153, 566, 97, 1873, 1875, 598, 1877, 1878, 593, - /* 680 */ 1688, 588, 218, 1374, 2028, 1716, 2048, 8, 1960, 1559, - /* 690 */ 37, 36, 339, 1956, 43, 41, 40, 39, 38, 565, - /* 700 */ 170, 2028, 1994, 540, 2029, 567, 540, 45, 631, 685, - /* 710 */ 527, 1784, 1318, 305, 1316, 413, 565, 170, 414, 1552, - /* 720 */ 1787, 2029, 567, 1398, 1399, 153, 627, 1779, 1558, 1729, - /* 730 */ 264, 1842, 1686, 241, 1689, 1686, 1321, 1322, 178, 1372, - /* 740 */ 1373, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 590, 586, - /* 750 */ 1389, 1390, 1392, 1393, 1394, 1395, 1397, 1400, 3, 1266, - /* 760 */ 37, 36, 540, 540, 43, 41, 40, 39, 38, 1318, - /* 770 */ 1842, 1316, 352, 1673, 458, 459, 173, 1502, 37, 36, - /* 780 */ 153, 1557, 43, 41, 40, 39, 38, 128, 1556, 1688, - /* 790 */ 1931, 1686, 1686, 1321, 1322, 26, 1372, 1373, 1375, 1376, - /* 800 */ 1377, 1378, 1379, 1380, 1381, 590, 586, 1389, 1390, 1392, - /* 810 */ 1393, 1394, 1395, 1397, 1400, 3, 44, 42, 526, 1317, - /* 820 */ 1779, 1555, 1738, 1842, 346, 628, 1317, 1554, 1729, 2033, - /* 830 */ 1842, 181, 1315, 540, 1553, 523, 1669, 1396, 1737, 1315, - /* 840 */ 32, 359, 1054, 1055, 485, 1683, 37, 36, 1550, 1874, - /* 850 */ 43, 41, 40, 39, 38, 644, 7, 1656, 523, 540, - /* 860 */ 1391, 1463, 1686, 1842, 2028, 1323, 484, 1549, 1874, 1842, - /* 870 */ 540, 136, 1323, 44, 42, 570, 1842, 540, 1892, 2034, - /* 880 */ 170, 346, 519, 1317, 2029, 567, 595, 2028, 1686, 524, - /* 890 */ 1842, 1842, 569, 594, 1396, 1345, 1315, 1892, 8, 1686, - /* 900 */ 518, 277, 2034, 170, 1716, 595, 1686, 2029, 567, 1842, - /* 910 */ 1842, 1342, 594, 685, 1872, 1829, 1548, 1391, 1907, 540, - /* 920 */ 685, 1525, 156, 1873, 1875, 598, 1877, 1878, 593, 1323, - /* 930 */ 588, 235, 221, 1872, 1398, 1399, 1547, 1907, 1532, 48, - /* 940 */ 4, 97, 1873, 1875, 598, 1877, 1878, 593, 1686, 588, - /* 950 */ 493, 492, 1546, 585, 2048, 1, 1960, 126, 1842, 1591, - /* 960 */ 339, 1956, 368, 545, 1997, 1980, 1459, 540, 488, 491, - /* 970 */ 2022, 1604, 540, 1318, 487, 1316, 1326, 685, 1842, 536, - /* 980 */ 1318, 494, 1316, 358, 538, 1545, 208, 210, 1544, 206, - /* 990 */ 209, 1398, 1399, 589, 1842, 229, 1686, 1321, 1322, 1543, - /* 1000 */ 523, 1686, 50, 522, 1321, 1322, 1542, 1372, 1373, 1375, - /* 1010 */ 1376, 1377, 1378, 1379, 1380, 1381, 590, 586, 1389, 1390, - /* 1020 */ 1392, 1393, 1394, 1395, 1397, 1400, 3, 1842, 540, 2028, - /* 1030 */ 1842, 540, 1531, 1534, 1535, 493, 492, 1318, 240, 1316, - /* 1040 */ 539, 1842, 126, 266, 2034, 170, 573, 233, 1842, 2029, - /* 1050 */ 567, 622, 137, 488, 491, 212, 1459, 1686, 211, 487, - /* 1060 */ 1686, 1321, 1322, 1601, 1372, 1373, 1375, 1376, 1377, 1378, - /* 1070 */ 1379, 1380, 1381, 590, 586, 1389, 1390, 1392, 1393, 1394, - /* 1080 */ 1395, 1397, 1400, 3, 307, 540, 1340, 214, 13, 12, - /* 1090 */ 213, 571, 1417, 421, 1325, 1374, 433, 353, 1462, 1586, - /* 1100 */ 1584, 93, 37, 36, 533, 2000, 43, 41, 40, 39, - /* 1110 */ 38, 90, 1644, 406, 1686, 434, 141, 408, 142, 1329, - /* 1120 */ 60, 496, 499, 259, 245, 60, 662, 661, 660, 659, - /* 1130 */ 356, 45, 658, 657, 133, 652, 651, 650, 649, 648, - /* 1140 */ 647, 646, 645, 146, 641, 640, 639, 355, 354, 636, - /* 1150 */ 635, 634, 633, 632, 554, 154, 478, 37, 36, 399, - /* 1160 */ 283, 43, 41, 40, 39, 38, 253, 1094, 237, 637, - /* 1170 */ 1163, 395, 1489, 45, 281, 66, 248, 1433, 65, 1863, - /* 1180 */ 37, 36, 1893, 1382, 43, 41, 40, 39, 38, 1482, - /* 1190 */ 602, 1114, 357, 1575, 187, 439, 437, 141, 1990, 432, - /* 1200 */ 1095, 1874, 427, 426, 425, 424, 423, 420, 419, 418, - /* 1210 */ 417, 416, 412, 411, 410, 409, 403, 402, 401, 400, - /* 1220 */ 142, 397, 396, 319, 638, 276, 1726, 1865, 37, 36, - /* 1230 */ 1892, 58, 43, 41, 40, 39, 38, 1328, 595, 122, - /* 1240 */ 141, 579, 1191, 1842, 261, 594, 1112, 1580, 258, 1195, - /* 1250 */ 2, 362, 5, 367, 318, 273, 180, 1282, 394, 1340, - /* 1260 */ 415, 1781, 422, 430, 574, 429, 1872, 431, 435, 96, - /* 1270 */ 1907, 436, 1202, 184, 97, 1873, 1875, 598, 1877, 1878, - /* 1280 */ 593, 313, 588, 438, 1346, 129, 441, 140, 1931, 1960, - /* 1290 */ 440, 1200, 145, 339, 1956, 680, 449, 1348, 452, 190, - /* 1300 */ 511, 192, 453, 1347, 454, 71, 70, 388, 1349, 455, - /* 1310 */ 177, 1874, 152, 195, 197, 457, 498, 523, 75, 76, - /* 1320 */ 461, 201, 480, 1425, 482, 1676, 205, 306, 1672, 207, - /* 1330 */ 376, 508, 374, 370, 366, 363, 360, 309, 120, 147, - /* 1340 */ 1892, 510, 148, 1674, 1670, 216, 2028, 149, 595, 512, - /* 1350 */ 150, 274, 219, 1842, 513, 594, 222, 520, 1820, 501, - /* 1360 */ 514, 2034, 170, 495, 525, 226, 2029, 567, 215, 517, - /* 1370 */ 552, 138, 534, 328, 528, 1819, 1872, 173, 1426, 1791, - /* 1380 */ 1907, 531, 330, 139, 97, 1873, 1875, 598, 1877, 1878, - /* 1390 */ 593, 535, 588, 1874, 84, 275, 86, 2048, 1687, 1960, - /* 1400 */ 1345, 548, 2006, 339, 1956, 64, 1991, 555, 63, 243, - /* 1410 */ 2001, 550, 2005, 1979, 551, 247, 335, 558, 6, 564, - /* 1420 */ 336, 549, 1892, 547, 546, 257, 575, 2027, 572, 1459, - /* 1430 */ 595, 1344, 2051, 256, 252, 1842, 1982, 594, 1976, 57, - /* 1440 */ 131, 1941, 88, 600, 1657, 161, 1874, 33, 343, 1420, - /* 1450 */ 1421, 1422, 1423, 1424, 1428, 1429, 1430, 1431, 1872, 254, - /* 1460 */ 255, 278, 1907, 1730, 260, 269, 97, 1873, 1875, 598, - /* 1470 */ 1877, 1878, 593, 681, 588, 1892, 49, 682, 304, 1935, - /* 1480 */ 290, 1960, 684, 595, 301, 339, 1956, 300, 1842, 1836, - /* 1490 */ 594, 282, 280, 1835, 68, 1834, 1833, 69, 1830, 364, - /* 1500 */ 365, 1309, 1310, 176, 369, 1828, 371, 372, 373, 1827, - /* 1510 */ 375, 1872, 1826, 377, 1874, 1907, 1825, 1824, 381, 97, - /* 1520 */ 1873, 1875, 598, 1877, 1878, 593, 379, 588, 1285, 1284, - /* 1530 */ 1802, 1801, 1933, 386, 1960, 387, 1874, 1800, 339, 1956, - /* 1540 */ 342, 341, 1799, 1892, 134, 1254, 1774, 1773, 1772, 1771, - /* 1550 */ 1331, 595, 1770, 1769, 72, 1768, 1842, 1767, 594, 1766, - /* 1560 */ 1765, 1396, 1764, 1324, 404, 1892, 1763, 405, 407, 1762, - /* 1570 */ 1761, 1760, 1759, 595, 1758, 1757, 1756, 1755, 1842, 1872, - /* 1580 */ 594, 1754, 1753, 1907, 1391, 1752, 1751, 97, 1873, 1875, - /* 1590 */ 598, 1877, 1878, 593, 1874, 588, 1323, 1750, 1749, 1748, - /* 1600 */ 543, 1872, 1960, 135, 1747, 1907, 339, 1956, 1746, 98, - /* 1610 */ 1873, 1875, 598, 1877, 1878, 593, 1745, 588, 1744, 1743, - /* 1620 */ 688, 1742, 1256, 1892, 1960, 1741, 1740, 1739, 1959, 1956, - /* 1630 */ 1606, 595, 1605, 1603, 272, 185, 1842, 1138, 594, 186, - /* 1640 */ 1571, 1570, 1057, 1056, 584, 188, 123, 1815, 164, 165, - /* 1650 */ 189, 445, 124, 678, 674, 670, 666, 270, 1809, 1872, - /* 1660 */ 447, 1798, 194, 1907, 196, 1797, 1783, 98, 1873, 1875, - /* 1670 */ 598, 1877, 1878, 593, 1665, 588, 1602, 1087, 1600, 462, - /* 1680 */ 1598, 463, 1960, 466, 464, 467, 583, 1956, 468, 1596, - /* 1690 */ 470, 472, 1594, 471, 95, 474, 1874, 238, 475, 1583, - /* 1700 */ 1582, 476, 1567, 1667, 1332, 1206, 1327, 1205, 1666, 1123, - /* 1710 */ 1129, 653, 59, 1592, 1128, 655, 1125, 1124, 204, 1587, - /* 1720 */ 324, 1585, 497, 325, 1566, 1892, 326, 1565, 1335, 1337, - /* 1730 */ 537, 500, 1564, 592, 506, 1814, 99, 1301, 1842, 1808, - /* 1740 */ 594, 586, 1389, 1390, 1392, 1393, 1394, 1395, 25, 502, - /* 1750 */ 504, 53, 1291, 515, 516, 1874, 223, 151, 1796, 1794, - /* 1760 */ 2033, 1872, 1795, 227, 1793, 1907, 1792, 1790, 1299, 298, - /* 1770 */ 1873, 1875, 598, 1877, 1878, 593, 591, 588, 541, 1925, - /* 1780 */ 18, 1289, 529, 220, 1892, 327, 228, 234, 82, 521, - /* 1790 */ 1782, 83, 595, 239, 90, 236, 532, 1842, 19, 594, - /* 1800 */ 85, 27, 15, 1408, 20, 1504, 244, 21, 56, 10, - /* 1810 */ 1874, 250, 1407, 1486, 242, 251, 246, 1863, 1488, 159, - /* 1820 */ 1872, 1481, 249, 28, 1907, 29, 61, 22, 157, 1873, - /* 1830 */ 1875, 598, 1877, 1878, 593, 89, 588, 1524, 1525, 1892, - /* 1840 */ 1519, 1518, 337, 1523, 1522, 338, 1456, 595, 1455, 263, - /* 1850 */ 1862, 12, 1842, 1418, 594, 16, 55, 1333, 54, 1365, - /* 1860 */ 162, 163, 174, 1874, 1910, 597, 1169, 1386, 587, 601, - /* 1870 */ 1384, 35, 1184, 1383, 14, 1872, 1357, 23, 599, 1907, - /* 1880 */ 568, 2049, 24, 98, 1873, 1875, 598, 1877, 1878, 593, - /* 1890 */ 1192, 588, 1892, 348, 603, 605, 1189, 329, 1960, 608, - /* 1900 */ 595, 611, 621, 1957, 614, 1842, 606, 594, 1201, 1183, - /* 1910 */ 1182, 1181, 1186, 609, 1874, 1180, 612, 267, 1197, 1178, - /* 1920 */ 615, 91, 92, 67, 1085, 1120, 630, 1119, 1872, 1118, - /* 1930 */ 1117, 1874, 1907, 1116, 642, 1115, 299, 1873, 1875, 598, - /* 1940 */ 1877, 1878, 593, 1892, 588, 1113, 1111, 1110, 1109, 1136, - /* 1950 */ 268, 592, 1107, 1106, 1105, 1104, 1842, 1103, 594, 1102, - /* 1960 */ 1892, 1101, 1100, 1131, 1097, 1133, 1096, 1091, 595, 1093, - /* 1970 */ 1599, 1092, 1090, 1842, 663, 594, 1597, 664, 667, 1872, - /* 1980 */ 665, 1595, 1593, 1907, 671, 668, 669, 298, 1873, 1875, - /* 1990 */ 598, 1877, 1878, 593, 673, 588, 1872, 1926, 672, 675, - /* 2000 */ 1907, 676, 677, 1581, 156, 1873, 1875, 598, 1877, 1878, - /* 2010 */ 593, 1563, 588, 679, 1047, 683, 1874, 271, 1319, 279, - /* 2020 */ 686, 687, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2030 */ 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2040 */ 1538, 1538, 1538, 1538, 1538, 1892, 1998, 1538, 1538, 1538, - /* 2050 */ 1538, 1538, 1538, 595, 1538, 1538, 1538, 1538, 1842, 1538, - /* 2060 */ 594, 1538, 1538, 1538, 1538, 1538, 1538, 1874, 1538, 1538, - /* 2070 */ 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2080 */ 1538, 1872, 1538, 1538, 1538, 1907, 1538, 1538, 1538, 294, - /* 2090 */ 1873, 1875, 598, 1877, 1878, 593, 1892, 588, 1538, 1538, - /* 2100 */ 1538, 1538, 1538, 1538, 595, 1538, 1538, 1538, 1538, 1842, - /* 2110 */ 1538, 594, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2120 */ 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2130 */ 1874, 1538, 1872, 563, 1538, 1538, 1907, 1538, 1538, 1538, - /* 2140 */ 157, 1873, 1875, 598, 1877, 1878, 593, 1538, 588, 1538, - /* 2150 */ 1874, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1892, - /* 2160 */ 1538, 1538, 1538, 1538, 344, 1538, 1538, 595, 1538, 1538, - /* 2170 */ 1538, 1538, 1842, 1538, 594, 1538, 1538, 1538, 1538, 1892, - /* 2180 */ 1538, 1538, 1538, 1538, 347, 1538, 1538, 595, 1538, 1538, - /* 2190 */ 1538, 1538, 1842, 2050, 594, 1872, 1538, 1538, 1538, 1907, - /* 2200 */ 1538, 1874, 1538, 299, 1873, 1875, 598, 1877, 1878, 593, - /* 2210 */ 1538, 588, 1538, 1538, 1538, 1872, 1538, 1538, 1874, 1907, - /* 2220 */ 1538, 1538, 1538, 299, 1873, 1875, 598, 1877, 1878, 593, - /* 2230 */ 1892, 588, 1538, 1538, 1538, 1538, 1538, 1538, 595, 1538, - /* 2240 */ 1538, 1538, 1538, 1842, 1538, 594, 1538, 1892, 1538, 1538, - /* 2250 */ 1538, 1538, 1538, 1538, 1538, 595, 1538, 1538, 1538, 1538, - /* 2260 */ 1842, 1874, 594, 1538, 1538, 1538, 509, 1538, 1538, 1538, - /* 2270 */ 1907, 1538, 1538, 1538, 292, 1873, 1875, 598, 1877, 1878, - /* 2280 */ 593, 1538, 588, 1872, 1538, 1538, 1538, 1907, 1538, 1538, - /* 2290 */ 1892, 284, 1873, 1875, 598, 1877, 1878, 593, 595, 588, - /* 2300 */ 1538, 1538, 1538, 1842, 1538, 594, 1538, 1538, 1538, 1538, - /* 2310 */ 1538, 1538, 1874, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2320 */ 1538, 1538, 1538, 1538, 1538, 1538, 1872, 1538, 1538, 1874, - /* 2330 */ 1907, 1538, 1538, 1538, 285, 1873, 1875, 598, 1877, 1878, - /* 2340 */ 593, 1892, 588, 1538, 1538, 1538, 1538, 1538, 1538, 595, - /* 2350 */ 1538, 1538, 1538, 1538, 1842, 1538, 594, 1538, 1892, 1538, - /* 2360 */ 1538, 1538, 1538, 1538, 1538, 1538, 595, 1538, 1538, 1538, - /* 2370 */ 1538, 1842, 1538, 594, 1538, 1538, 1538, 1872, 1538, 1538, - /* 2380 */ 1874, 1907, 1538, 1538, 1538, 286, 1873, 1875, 598, 1877, - /* 2390 */ 1878, 593, 1538, 588, 1872, 1538, 1538, 1538, 1907, 1538, - /* 2400 */ 1538, 1538, 293, 1873, 1875, 598, 1877, 1878, 593, 1892, - /* 2410 */ 588, 1538, 1538, 1538, 1538, 1538, 1538, 595, 1538, 1538, - /* 2420 */ 1538, 1538, 1842, 1538, 594, 1538, 1538, 1538, 1538, 1538, - /* 2430 */ 1538, 1874, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2440 */ 1538, 1538, 1538, 1538, 1538, 1872, 1538, 1538, 1538, 1907, - /* 2450 */ 1874, 1538, 1538, 295, 1873, 1875, 598, 1877, 1878, 593, - /* 2460 */ 1892, 588, 1538, 1538, 1538, 1538, 1538, 1538, 595, 1538, - /* 2470 */ 1538, 1538, 1538, 1842, 1538, 594, 1538, 1538, 1538, 1892, - /* 2480 */ 1538, 1538, 1538, 1538, 1538, 1538, 1538, 595, 1538, 1538, - /* 2490 */ 1538, 1538, 1842, 1538, 594, 1538, 1872, 1538, 1538, 1538, - /* 2500 */ 1907, 1538, 1538, 1538, 287, 1873, 1875, 598, 1877, 1878, - /* 2510 */ 593, 1538, 588, 1874, 1538, 1872, 1538, 1538, 1538, 1907, - /* 2520 */ 1538, 1538, 1538, 296, 1873, 1875, 598, 1877, 1878, 593, - /* 2530 */ 1538, 588, 1538, 1538, 1538, 1874, 1538, 1538, 1538, 1538, - /* 2540 */ 1538, 1538, 1892, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2550 */ 595, 1538, 1538, 1538, 1538, 1842, 1538, 594, 1538, 1538, - /* 2560 */ 1538, 1538, 1538, 1538, 1892, 1538, 1538, 1538, 1538, 1538, - /* 2570 */ 1538, 1538, 595, 1538, 1538, 1538, 1538, 1842, 1872, 594, - /* 2580 */ 1538, 1538, 1907, 1538, 1538, 1538, 288, 1873, 1875, 598, - /* 2590 */ 1877, 1878, 593, 1538, 588, 1874, 1538, 1538, 1538, 1538, - /* 2600 */ 1872, 1538, 1538, 1538, 1907, 1538, 1538, 1538, 297, 1873, - /* 2610 */ 1875, 598, 1877, 1878, 593, 1874, 588, 1538, 1538, 1538, - /* 2620 */ 1538, 1538, 1538, 1538, 1892, 1538, 1538, 1538, 1538, 1538, - /* 2630 */ 1538, 1538, 595, 1538, 1538, 1538, 1538, 1842, 1538, 594, - /* 2640 */ 1538, 1538, 1538, 1538, 1892, 1538, 1538, 1538, 1538, 1538, - /* 2650 */ 1538, 1538, 595, 1538, 1538, 1538, 1538, 1842, 1874, 594, - /* 2660 */ 1872, 1538, 1538, 1538, 1907, 1538, 1538, 1538, 289, 1873, - /* 2670 */ 1875, 598, 1877, 1878, 593, 1538, 588, 1538, 1874, 1538, - /* 2680 */ 1872, 1538, 1538, 1538, 1907, 1538, 1538, 1892, 302, 1873, - /* 2690 */ 1875, 598, 1877, 1878, 593, 595, 588, 1538, 1538, 1538, - /* 2700 */ 1842, 1538, 594, 1538, 1538, 1538, 1538, 1892, 1538, 1538, - /* 2710 */ 1538, 1538, 1538, 1538, 1538, 595, 1538, 1538, 1538, 1538, - /* 2720 */ 1842, 1538, 594, 1872, 1538, 1538, 1538, 1907, 1538, 1874, - /* 2730 */ 1538, 303, 1873, 1875, 598, 1877, 1878, 593, 1538, 588, - /* 2740 */ 1538, 1538, 1538, 1872, 1538, 1538, 1538, 1907, 1538, 1538, - /* 2750 */ 1538, 1886, 1873, 1875, 598, 1877, 1878, 593, 1892, 588, - /* 2760 */ 1538, 1538, 1538, 1538, 1538, 1538, 595, 1538, 1538, 1538, - /* 2770 */ 1538, 1842, 1538, 594, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2780 */ 1874, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2790 */ 1538, 1538, 1538, 1538, 1872, 1538, 1538, 1538, 1907, 1874, - /* 2800 */ 1538, 1538, 1885, 1873, 1875, 598, 1877, 1878, 593, 1892, - /* 2810 */ 588, 1538, 1538, 1538, 1538, 1538, 1538, 595, 1538, 1538, - /* 2820 */ 1538, 1538, 1842, 1538, 594, 1538, 1538, 1538, 1892, 1538, - /* 2830 */ 1538, 1538, 1538, 1538, 1538, 1538, 595, 1538, 1538, 1538, - /* 2840 */ 1538, 1842, 1538, 594, 1538, 1872, 1538, 1538, 1538, 1907, - /* 2850 */ 1538, 1538, 1538, 1884, 1873, 1875, 598, 1877, 1878, 593, - /* 2860 */ 1538, 588, 1874, 1538, 1872, 1538, 1538, 1538, 1907, 1538, - /* 2870 */ 1538, 1538, 314, 1873, 1875, 598, 1877, 1878, 593, 1538, - /* 2880 */ 588, 1538, 1538, 1538, 1874, 1538, 1538, 1538, 1538, 1538, - /* 2890 */ 1538, 1892, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 595, - /* 2900 */ 1538, 1538, 1538, 1538, 1842, 1538, 594, 1538, 1538, 1538, - /* 2910 */ 1538, 1538, 1538, 1892, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2920 */ 1538, 595, 1538, 1538, 1538, 1538, 1842, 1872, 594, 1538, - /* 2930 */ 1538, 1907, 1538, 1538, 1538, 315, 1873, 1875, 598, 1877, - /* 2940 */ 1878, 593, 1538, 588, 1874, 1538, 1538, 1538, 1538, 1872, - /* 2950 */ 1538, 1538, 1538, 1907, 1538, 1538, 1538, 311, 1873, 1875, - /* 2960 */ 598, 1877, 1878, 593, 1874, 588, 1538, 1538, 1538, 1538, - /* 2970 */ 1538, 1538, 1538, 1892, 1538, 1538, 1538, 1538, 1538, 1538, - /* 2980 */ 1538, 595, 1538, 1538, 1538, 1538, 1842, 1538, 594, 1538, - /* 2990 */ 1538, 1538, 1538, 1892, 1538, 1538, 1538, 1538, 1538, 1538, - /* 3000 */ 1538, 595, 1538, 1538, 1538, 1538, 1842, 1538, 594, 1872, - /* 3010 */ 1538, 1538, 1538, 1907, 1538, 1538, 1538, 316, 1873, 1875, - /* 3020 */ 598, 1877, 1878, 593, 1538, 588, 1538, 1538, 1538, 1872, - /* 3030 */ 1538, 1538, 1538, 1907, 1538, 1538, 1538, 291, 1873, 1875, - /* 3040 */ 598, 1877, 1878, 593, 1538, 588, + /* 0 */ 1868, 1797, 447, 1868, 448, 1581, 455, 1882, 448, 1581, + /* 10 */ 1684, 1864, 44, 42, 1864, 354, 544, 394, 1738, 1740, + /* 20 */ 349, 1864, 1323, 43, 41, 40, 39, 38, 52, 2042, + /* 30 */ 34, 267, 585, 1403, 1348, 1321, 1900, 1860, 1866, 337, + /* 40 */ 1860, 1866, 343, 1349, 586, 1693, 1350, 1860, 1866, 1850, + /* 50 */ 592, 598, 30, 592, 1671, 310, 1398, 1055, 37, 36, + /* 60 */ 592, 17, 43, 41, 40, 39, 38, 1882, 1329, 44, + /* 70 */ 42, 1473, 1880, 40, 39, 38, 1916, 349, 570, 1323, + /* 80 */ 97, 1881, 1883, 602, 1885, 1886, 597, 1072, 592, 1071, + /* 90 */ 1403, 62, 1321, 168, 1, 1969, 1900, 1059, 1060, 342, + /* 100 */ 1965, 77, 483, 464, 599, 582, 46, 2037, 58, 1850, + /* 110 */ 585, 598, 173, 1398, 464, 125, 689, 1073, 17, 531, + /* 120 */ 1995, 1532, 569, 171, 1688, 1329, 334, 2038, 571, 1794, + /* 130 */ 1405, 1406, 600, 585, 132, 181, 1916, 1547, 154, 227, + /* 140 */ 98, 348, 1883, 602, 1885, 1886, 597, 1696, 592, 1900, + /* 150 */ 1072, 1, 1071, 1217, 1218, 1969, 58, 564, 109, 314, + /* 160 */ 1965, 108, 107, 106, 105, 104, 103, 102, 101, 100, + /* 170 */ 2037, 130, 74, 689, 58, 73, 1324, 58, 1322, 81, + /* 180 */ 1073, 58, 1669, 1569, 46, 569, 171, 1405, 1406, 266, + /* 190 */ 2038, 571, 584, 169, 1977, 1978, 563, 1982, 1739, 1740, + /* 200 */ 1327, 1328, 635, 1378, 1379, 1381, 1382, 1383, 1384, 1385, + /* 210 */ 1386, 1387, 1388, 594, 590, 1396, 1397, 1399, 1400, 1401, + /* 220 */ 1402, 1404, 1407, 3, 205, 1850, 233, 234, 1349, 633, + /* 230 */ 582, 159, 325, 1324, 1477, 1322, 1650, 387, 161, 386, + /* 240 */ 1348, 174, 635, 481, 477, 473, 469, 204, 145, 144, + /* 250 */ 630, 629, 628, 174, 156, 174, 1558, 1327, 1328, 132, + /* 260 */ 1378, 1379, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, + /* 270 */ 594, 590, 1396, 1397, 1399, 1400, 1401, 1402, 1404, 1407, + /* 280 */ 3, 44, 42, 219, 78, 312, 167, 202, 534, 349, + /* 290 */ 335, 1323, 326, 1568, 324, 323, 130, 487, 154, 1732, + /* 300 */ 582, 489, 1403, 174, 1321, 1567, 109, 1695, 1348, 108, + /* 310 */ 107, 106, 105, 104, 103, 102, 101, 100, 170, 1977, + /* 320 */ 1978, 174, 1982, 488, 174, 1398, 565, 1745, 174, 132, + /* 330 */ 17, 1869, 560, 1882, 336, 1850, 232, 1329, 44, 42, + /* 340 */ 79, 312, 1864, 1743, 534, 1787, 349, 1850, 1323, 582, + /* 350 */ 201, 195, 47, 200, 452, 544, 179, 460, 94, 1403, + /* 360 */ 1346, 1321, 1900, 1, 544, 1413, 130, 119, 1860, 1866, + /* 370 */ 586, 1348, 127, 193, 485, 1850, 119, 598, 132, 1745, + /* 380 */ 1685, 592, 1398, 490, 1693, 689, 353, 17, 172, 1977, + /* 390 */ 1978, 395, 1982, 1693, 1329, 1743, 1301, 1302, 1880, 1405, + /* 400 */ 1406, 1499, 1916, 1546, 396, 352, 97, 1881, 1883, 602, + /* 410 */ 1885, 1886, 597, 154, 592, 121, 1135, 566, 561, 168, + /* 420 */ 1, 1969, 1695, 1434, 1380, 342, 1965, 118, 117, 116, + /* 430 */ 115, 114, 113, 112, 111, 110, 2042, 264, 1977, 581, + /* 440 */ 432, 580, 689, 77, 2037, 1324, 1996, 1322, 511, 1137, + /* 450 */ 355, 557, 1497, 1498, 1500, 1501, 1405, 1406, 154, 569, + /* 460 */ 171, 509, 1350, 507, 2038, 571, 1689, 1695, 1347, 1327, + /* 470 */ 1328, 1670, 1378, 1379, 1381, 1382, 1383, 1384, 1385, 1386, + /* 480 */ 1387, 1388, 594, 590, 1396, 1397, 1399, 1400, 1401, 1402, + /* 490 */ 1404, 1407, 3, 31, 11, 446, 185, 184, 450, 174, + /* 500 */ 494, 493, 1324, 1439, 1322, 1329, 1175, 624, 623, 622, + /* 510 */ 1179, 621, 1181, 1182, 620, 1184, 617, 1566, 1190, 614, + /* 520 */ 1192, 1193, 611, 608, 1984, 2042, 1327, 1328, 1532, 1378, + /* 530 */ 1379, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 594, + /* 540 */ 590, 1396, 1397, 1399, 1400, 1401, 1402, 1404, 1407, 3, + /* 550 */ 44, 42, 1981, 544, 2037, 1380, 660, 658, 349, 1850, + /* 560 */ 1323, 11, 1332, 9, 544, 176, 544, 627, 1565, 454, + /* 570 */ 2041, 1403, 450, 1321, 2038, 2040, 392, 633, 393, 1564, + /* 580 */ 37, 36, 1693, 1882, 43, 41, 40, 39, 38, 544, + /* 590 */ 13, 12, 1351, 1693, 1398, 1693, 145, 144, 630, 629, + /* 600 */ 628, 403, 1882, 1668, 544, 266, 1329, 44, 42, 1408, + /* 610 */ 1850, 544, 1900, 1563, 544, 349, 417, 1323, 1693, 1984, + /* 620 */ 599, 1850, 1745, 418, 1562, 1850, 462, 598, 1403, 1745, + /* 630 */ 1321, 1900, 8, 1693, 11, 546, 319, 1941, 1744, 599, + /* 640 */ 1693, 544, 226, 1693, 1850, 1743, 598, 1980, 600, 1561, + /* 650 */ 87, 1398, 1916, 463, 689, 1850, 294, 348, 1883, 602, + /* 660 */ 1885, 1886, 597, 1329, 592, 647, 1850, 1880, 1405, 1406, + /* 670 */ 1693, 1916, 1686, 1560, 570, 97, 1881, 1883, 602, 1885, + /* 680 */ 1886, 597, 80, 592, 1446, 1793, 2037, 307, 2057, 8, + /* 690 */ 1969, 1850, 37, 36, 342, 1965, 43, 41, 40, 39, + /* 700 */ 38, 569, 171, 2037, 2003, 1335, 2038, 571, 544, 633, + /* 710 */ 548, 689, 1941, 383, 1324, 1850, 1322, 1544, 569, 171, + /* 720 */ 356, 1059, 1060, 2038, 571, 1405, 1406, 26, 145, 144, + /* 730 */ 630, 629, 628, 385, 381, 243, 1557, 1693, 1327, 1328, + /* 740 */ 1682, 1378, 1379, 1381, 1382, 1383, 1384, 1385, 1386, 1387, + /* 750 */ 1388, 594, 590, 1396, 1397, 1399, 1400, 1401, 1402, 1404, + /* 760 */ 1407, 3, 37, 36, 544, 1678, 43, 41, 40, 39, + /* 770 */ 38, 1324, 220, 1322, 1787, 1723, 1690, 364, 1850, 174, + /* 780 */ 2041, 1351, 37, 36, 1556, 180, 43, 41, 40, 39, + /* 790 */ 38, 1611, 1555, 1693, 527, 1327, 1328, 7, 1378, 1379, + /* 800 */ 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 594, 590, + /* 810 */ 1396, 1397, 1399, 1400, 1401, 1402, 1404, 1407, 3, 44, + /* 820 */ 42, 544, 1323, 2037, 1554, 1553, 1850, 349, 574, 1323, + /* 830 */ 1552, 531, 1680, 137, 1850, 1321, 544, 1099, 2043, 171, + /* 840 */ 1403, 1795, 1321, 2038, 571, 1676, 1551, 32, 523, 1509, + /* 850 */ 1693, 1470, 1882, 37, 36, 497, 496, 43, 41, 40, + /* 860 */ 39, 38, 126, 1398, 1550, 1693, 1850, 1850, 1329, 2042, + /* 870 */ 1100, 1882, 1850, 492, 495, 1329, 44, 42, 544, 491, + /* 880 */ 544, 1900, 1984, 544, 349, 1792, 1323, 307, 1850, 599, + /* 890 */ 528, 1787, 237, 544, 1850, 540, 598, 1403, 2037, 1321, + /* 900 */ 1900, 8, 183, 1989, 1466, 542, 1850, 1693, 599, 1693, + /* 910 */ 1979, 1348, 1693, 1850, 2041, 598, 689, 1880, 2038, 2039, + /* 920 */ 1398, 1916, 1693, 689, 242, 157, 1881, 1883, 602, 1885, + /* 930 */ 1886, 597, 1329, 592, 489, 223, 1880, 1405, 1406, 1549, + /* 940 */ 1916, 544, 1539, 544, 97, 1881, 1883, 602, 1885, 1886, + /* 950 */ 597, 128, 592, 543, 1940, 268, 488, 2057, 1, 1969, + /* 960 */ 648, 593, 1663, 342, 1965, 631, 549, 2006, 1736, 522, + /* 970 */ 1693, 632, 1693, 2031, 1736, 1598, 1324, 626, 1322, 279, + /* 980 */ 689, 1850, 1723, 1324, 143, 1322, 48, 4, 210, 402, + /* 990 */ 212, 208, 45, 211, 1405, 1406, 214, 498, 1466, 213, + /* 1000 */ 1327, 1328, 1837, 216, 50, 526, 215, 1327, 1328, 1593, + /* 1010 */ 1378, 1379, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, + /* 1020 */ 594, 590, 1396, 1397, 1399, 1400, 1401, 1402, 1404, 1407, + /* 1030 */ 3, 500, 1541, 1542, 577, 573, 51, 1538, 72, 1331, + /* 1040 */ 1324, 231, 1322, 1559, 1272, 575, 37, 36, 589, 371, + /* 1050 */ 43, 41, 40, 39, 38, 37, 36, 138, 2009, 43, + /* 1060 */ 41, 40, 39, 38, 1327, 1328, 1608, 1378, 1379, 1381, + /* 1070 */ 1382, 1383, 1384, 1385, 1386, 1387, 1388, 594, 590, 1396, + /* 1080 */ 1397, 1399, 1400, 1401, 1402, 1404, 1407, 3, 309, 1469, + /* 1090 */ 1346, 13, 12, 235, 93, 1380, 1591, 425, 261, 558, + /* 1100 */ 437, 641, 642, 1651, 90, 482, 37, 36, 142, 537, + /* 1110 */ 43, 41, 40, 39, 38, 143, 60, 410, 503, 438, + /* 1120 */ 247, 412, 60, 1119, 1117, 1587, 255, 45, 1901, 666, + /* 1130 */ 665, 664, 663, 359, 45, 662, 661, 133, 656, 655, + /* 1140 */ 654, 653, 652, 651, 650, 649, 147, 645, 644, 643, + /* 1150 */ 358, 357, 640, 639, 638, 637, 636, 155, 360, 1582, + /* 1160 */ 239, 1999, 285, 322, 1733, 583, 263, 1168, 1496, 260, + /* 1170 */ 2, 5, 250, 684, 1440, 398, 283, 66, 388, 1389, + /* 1180 */ 65, 365, 1334, 1871, 606, 142, 278, 1424, 275, 143, + /* 1190 */ 370, 122, 320, 1489, 142, 527, 189, 443, 441, 1288, + /* 1200 */ 182, 153, 397, 436, 401, 1882, 431, 430, 429, 428, + /* 1210 */ 427, 424, 423, 422, 421, 420, 416, 415, 414, 413, + /* 1220 */ 407, 406, 405, 404, 2037, 400, 399, 321, 1346, 419, + /* 1230 */ 426, 1873, 1789, 58, 1900, 433, 1196, 1200, 434, 2043, + /* 1240 */ 171, 1207, 599, 1205, 2038, 571, 146, 1850, 435, 598, + /* 1250 */ 440, 37, 36, 578, 439, 43, 41, 40, 39, 38, + /* 1260 */ 186, 1352, 442, 444, 445, 453, 1354, 457, 192, 456, + /* 1270 */ 1880, 96, 194, 1353, 1916, 458, 1355, 197, 97, 1881, + /* 1280 */ 1883, 602, 1885, 1886, 597, 459, 592, 497, 496, 129, + /* 1290 */ 461, 141, 1940, 1969, 126, 199, 75, 342, 1965, 76, + /* 1300 */ 465, 530, 203, 362, 315, 492, 495, 71, 70, 391, + /* 1310 */ 361, 491, 178, 120, 484, 486, 1882, 1683, 527, 311, + /* 1320 */ 527, 1828, 207, 1679, 514, 209, 148, 527, 149, 308, + /* 1330 */ 1681, 1677, 379, 276, 377, 373, 369, 366, 363, 150, + /* 1340 */ 516, 221, 151, 518, 517, 1900, 1432, 2037, 224, 2037, + /* 1350 */ 521, 524, 529, 599, 331, 556, 2037, 228, 1850, 538, + /* 1360 */ 598, 515, 2043, 171, 2043, 171, 139, 2038, 571, 2038, + /* 1370 */ 571, 2043, 171, 140, 532, 1827, 2038, 571, 527, 1799, + /* 1380 */ 174, 1880, 535, 333, 84, 1916, 539, 277, 86, 97, + /* 1390 */ 1881, 1883, 602, 1885, 1886, 597, 1694, 592, 1351, 2000, + /* 1400 */ 2010, 1433, 2057, 552, 1969, 559, 245, 2037, 342, 1965, + /* 1410 */ 692, 554, 2015, 555, 338, 249, 6, 2014, 1988, 562, + /* 1420 */ 254, 1882, 2043, 171, 274, 568, 553, 2038, 571, 551, + /* 1430 */ 550, 1991, 162, 256, 339, 259, 579, 257, 165, 576, + /* 1440 */ 1466, 258, 131, 682, 678, 674, 670, 272, 1350, 57, + /* 1450 */ 1900, 1985, 88, 604, 2060, 1950, 1737, 1664, 599, 280, + /* 1460 */ 271, 2036, 685, 1850, 1882, 598, 49, 262, 686, 688, + /* 1470 */ 306, 33, 346, 1427, 1428, 1429, 1430, 1431, 1435, 1436, + /* 1480 */ 1437, 1438, 284, 292, 95, 282, 1880, 240, 1844, 1843, + /* 1490 */ 1916, 68, 303, 1900, 97, 1881, 1883, 602, 1885, 1886, + /* 1500 */ 597, 599, 592, 302, 1842, 1841, 1850, 1944, 598, 1969, + /* 1510 */ 69, 345, 344, 342, 1965, 1838, 367, 1882, 368, 1315, + /* 1520 */ 541, 1337, 1316, 372, 1836, 177, 374, 375, 376, 1880, + /* 1530 */ 1835, 378, 1403, 1916, 1330, 1834, 380, 97, 1881, 1883, + /* 1540 */ 602, 1885, 1886, 597, 384, 592, 1900, 1833, 382, 1832, + /* 1550 */ 1942, 1291, 1969, 229, 599, 1398, 342, 1965, 1290, 1850, + /* 1560 */ 1810, 598, 1809, 1808, 389, 390, 1807, 1329, 1782, 1260, + /* 1570 */ 1882, 1295, 1781, 222, 1779, 134, 1778, 1777, 1780, 135, + /* 1580 */ 1776, 1775, 1880, 1774, 1773, 1772, 1916, 1771, 408, 409, + /* 1590 */ 97, 1881, 1883, 602, 1885, 1886, 597, 1770, 592, 1900, + /* 1600 */ 411, 1769, 1768, 547, 1262, 1969, 1767, 599, 1766, 342, + /* 1610 */ 1965, 1765, 1850, 1882, 598, 588, 1764, 1763, 1762, 1761, + /* 1620 */ 1760, 1759, 1758, 1757, 1756, 1755, 1754, 1753, 136, 1752, + /* 1630 */ 1751, 1750, 1749, 1748, 1747, 1880, 1746, 1613, 1143, 1916, + /* 1640 */ 1612, 1610, 1900, 98, 1881, 1883, 602, 1885, 1886, 597, + /* 1650 */ 599, 592, 187, 1578, 188, 1850, 190, 598, 1969, 1062, + /* 1660 */ 1061, 449, 1968, 1965, 198, 1805, 1882, 123, 1577, 1823, + /* 1670 */ 1817, 1806, 1791, 1672, 124, 1338, 1609, 1333, 1880, 1607, + /* 1680 */ 1605, 166, 1916, 191, 466, 451, 98, 1881, 1883, 602, + /* 1690 */ 1885, 1886, 597, 196, 592, 1900, 468, 467, 470, 1341, + /* 1700 */ 1343, 1969, 471, 596, 1092, 587, 1965, 1603, 1850, 474, + /* 1710 */ 598, 1601, 1590, 590, 1396, 1397, 1399, 1400, 1401, 1402, + /* 1720 */ 472, 476, 1882, 478, 475, 479, 480, 1589, 1574, 1674, + /* 1730 */ 1211, 1880, 1210, 1673, 1134, 1916, 1133, 657, 1130, 300, + /* 1740 */ 1881, 1883, 602, 1885, 1886, 597, 595, 592, 545, 1934, + /* 1750 */ 1129, 1900, 659, 206, 59, 1599, 1128, 327, 1594, 599, + /* 1760 */ 328, 1592, 501, 329, 1850, 504, 598, 1573, 1572, 1571, + /* 1770 */ 510, 99, 506, 1822, 508, 53, 1816, 1297, 1307, 25, + /* 1780 */ 1804, 519, 1802, 1803, 1882, 18, 152, 1880, 1801, 502, + /* 1790 */ 2042, 1916, 1800, 230, 1798, 158, 1881, 1883, 602, 1885, + /* 1800 */ 1886, 597, 236, 592, 512, 1305, 1790, 520, 225, 90, + /* 1810 */ 82, 83, 241, 1900, 85, 1415, 10, 19, 218, 330, + /* 1820 */ 536, 599, 20, 525, 1414, 238, 1850, 1511, 598, 56, + /* 1830 */ 253, 61, 505, 15, 27, 1871, 499, 244, 252, 246, + /* 1840 */ 1493, 217, 1882, 248, 29, 1495, 160, 572, 2058, 1880, + /* 1850 */ 533, 251, 22, 1916, 28, 21, 89, 98, 1881, 1883, + /* 1860 */ 602, 1885, 1886, 597, 1882, 592, 1488, 1526, 1525, 340, + /* 1870 */ 1531, 1900, 1969, 1532, 1530, 1529, 332, 1966, 64, 599, + /* 1880 */ 341, 63, 265, 1870, 1850, 1463, 598, 55, 1462, 163, + /* 1890 */ 12, 1339, 1425, 1900, 1919, 164, 175, 1393, 591, 35, + /* 1900 */ 54, 596, 1391, 1390, 14, 16, 1850, 1880, 598, 23, + /* 1910 */ 24, 1916, 1363, 1371, 1197, 301, 1881, 1883, 602, 1885, + /* 1920 */ 1886, 597, 605, 592, 1882, 601, 603, 351, 609, 1880, + /* 1930 */ 1194, 612, 607, 1916, 615, 610, 613, 300, 1881, 1883, + /* 1940 */ 602, 1885, 1886, 597, 618, 592, 1191, 1935, 1185, 616, + /* 1950 */ 1174, 1183, 619, 1900, 625, 91, 92, 1206, 67, 269, + /* 1960 */ 1202, 599, 1090, 634, 1189, 1188, 1850, 1882, 598, 1125, + /* 1970 */ 1187, 1124, 1186, 1141, 1123, 1122, 1121, 1120, 1118, 1116, + /* 1980 */ 1115, 1114, 1110, 1108, 1882, 646, 1112, 1111, 1109, 1880, + /* 1990 */ 270, 1107, 1106, 1916, 1105, 1138, 1900, 157, 1881, 1883, + /* 2000 */ 602, 1885, 1886, 597, 599, 592, 1136, 1102, 1101, 1850, + /* 2010 */ 1098, 598, 1097, 1900, 1096, 1095, 1606, 667, 669, 1604, + /* 2020 */ 671, 599, 673, 668, 1602, 672, 1850, 677, 598, 675, + /* 2030 */ 1600, 676, 1880, 679, 680, 681, 1916, 1588, 1882, 2007, + /* 2040 */ 296, 1881, 1883, 602, 1885, 1886, 597, 683, 592, 1880, + /* 2050 */ 1052, 1570, 687, 1916, 273, 1325, 1882, 158, 1881, 1883, + /* 2060 */ 602, 1885, 1886, 597, 281, 592, 690, 1900, 691, 1545, + /* 2070 */ 1545, 1545, 347, 1545, 1545, 599, 1545, 1545, 1545, 1545, + /* 2080 */ 1850, 1545, 598, 1545, 567, 1900, 1545, 1545, 1545, 1545, + /* 2090 */ 350, 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, + /* 2100 */ 598, 1545, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, + /* 2110 */ 2059, 301, 1881, 1883, 602, 1885, 1886, 597, 1882, 592, + /* 2120 */ 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1545, 301, + /* 2130 */ 1881, 1883, 602, 1885, 1886, 597, 1545, 592, 1545, 1545, + /* 2140 */ 1545, 1545, 1882, 1545, 1545, 1545, 1545, 1900, 1545, 1545, + /* 2150 */ 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, + /* 2160 */ 1850, 1545, 598, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + /* 2170 */ 1545, 1900, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 599, + /* 2180 */ 1545, 1545, 1545, 513, 1850, 1882, 598, 1916, 1545, 1545, + /* 2190 */ 1545, 294, 1881, 1883, 602, 1885, 1886, 597, 1545, 592, + /* 2200 */ 1545, 1545, 1545, 1545, 1545, 1882, 1545, 1880, 1545, 1545, + /* 2210 */ 1545, 1916, 1545, 1545, 1900, 286, 1881, 1883, 602, 1885, + /* 2220 */ 1886, 597, 599, 592, 1545, 1545, 1545, 1850, 1545, 598, + /* 2230 */ 1545, 1545, 1545, 1545, 1900, 1545, 1545, 1545, 1545, 1545, + /* 2240 */ 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, 598, + /* 2250 */ 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1545, 287, 1881, + /* 2260 */ 1883, 602, 1885, 1886, 597, 1545, 592, 1545, 1882, 1545, + /* 2270 */ 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1545, 288, 1881, + /* 2280 */ 1883, 602, 1885, 1886, 597, 1545, 592, 1882, 1545, 1545, + /* 2290 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1900, 1545, 1545, + /* 2300 */ 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, + /* 2310 */ 1850, 1545, 598, 1545, 1545, 1545, 1900, 1545, 1545, 1545, + /* 2320 */ 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, + /* 2330 */ 1882, 598, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, + /* 2340 */ 1545, 295, 1881, 1883, 602, 1885, 1886, 597, 1545, 592, + /* 2350 */ 1545, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1900, + /* 2360 */ 297, 1881, 1883, 602, 1885, 1886, 597, 599, 592, 1545, + /* 2370 */ 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, 1545, 1545, + /* 2380 */ 1545, 1882, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + /* 2390 */ 1545, 1545, 1545, 1545, 1545, 1880, 1545, 1545, 1545, 1916, + /* 2400 */ 1545, 1882, 1545, 289, 1881, 1883, 602, 1885, 1886, 597, + /* 2410 */ 1900, 592, 1545, 1545, 1545, 1545, 1545, 1545, 599, 1545, + /* 2420 */ 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, 1545, + /* 2430 */ 1900, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 599, 1545, + /* 2440 */ 1545, 1545, 1545, 1850, 1545, 598, 1880, 1545, 1545, 1545, + /* 2450 */ 1916, 1545, 1882, 1545, 298, 1881, 1883, 602, 1885, 1886, + /* 2460 */ 597, 1545, 592, 1545, 1545, 1545, 1880, 1545, 1545, 1545, + /* 2470 */ 1916, 1545, 1545, 1545, 290, 1881, 1883, 602, 1885, 1886, + /* 2480 */ 597, 1900, 592, 1545, 1545, 1545, 1545, 1545, 1545, 599, + /* 2490 */ 1545, 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, + /* 2500 */ 1545, 1545, 1545, 1545, 1545, 1882, 1545, 1545, 1545, 1545, + /* 2510 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1880, 1545, 1545, + /* 2520 */ 1545, 1916, 1545, 1545, 1545, 299, 1881, 1883, 602, 1885, + /* 2530 */ 1886, 597, 1545, 592, 1900, 1545, 1545, 1545, 1545, 1545, + /* 2540 */ 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, 1882, 598, + /* 2550 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + /* 2560 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1882, 1545, + /* 2570 */ 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1900, 291, 1881, + /* 2580 */ 1883, 602, 1885, 1886, 597, 599, 592, 1545, 1545, 1545, + /* 2590 */ 1850, 1545, 598, 1545, 1545, 1545, 1545, 1900, 1545, 1545, + /* 2600 */ 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, + /* 2610 */ 1850, 1545, 598, 1880, 1545, 1545, 1545, 1916, 1545, 1545, + /* 2620 */ 1545, 304, 1881, 1883, 602, 1885, 1886, 597, 1545, 592, + /* 2630 */ 1545, 1882, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, + /* 2640 */ 1545, 305, 1881, 1883, 602, 1885, 1886, 597, 1545, 592, + /* 2650 */ 1882, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + /* 2660 */ 1900, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 599, 1545, + /* 2670 */ 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, 1900, + /* 2680 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, + /* 2690 */ 1545, 1545, 1850, 1882, 598, 1545, 1880, 1545, 1545, 1545, + /* 2700 */ 1916, 1545, 1545, 1545, 1894, 1881, 1883, 602, 1885, 1886, + /* 2710 */ 597, 1545, 592, 1545, 1545, 1880, 1545, 1545, 1545, 1916, + /* 2720 */ 1545, 1545, 1900, 1893, 1881, 1883, 602, 1885, 1886, 597, + /* 2730 */ 599, 592, 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, + /* 2740 */ 1545, 1545, 1545, 1545, 1882, 1545, 1545, 1545, 1545, 1545, + /* 2750 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1880, 1545, + /* 2760 */ 1545, 1545, 1916, 1545, 1882, 1545, 1892, 1881, 1883, 602, + /* 2770 */ 1885, 1886, 597, 1900, 592, 1545, 1545, 1545, 1545, 1545, + /* 2780 */ 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, 598, 1545, + /* 2790 */ 1545, 1545, 1545, 1900, 1545, 1545, 1545, 1545, 1545, 1545, + /* 2800 */ 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, 598, 1880, + /* 2810 */ 1545, 1545, 1545, 1916, 1545, 1882, 1545, 316, 1881, 1883, + /* 2820 */ 602, 1885, 1886, 597, 1545, 592, 1545, 1545, 1545, 1880, + /* 2830 */ 1545, 1545, 1545, 1916, 1545, 1545, 1545, 317, 1881, 1883, + /* 2840 */ 602, 1885, 1886, 597, 1900, 592, 1545, 1545, 1545, 1545, + /* 2850 */ 1545, 1545, 599, 1545, 1545, 1545, 1545, 1850, 1545, 598, + /* 2860 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1882, 1545, + /* 2870 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + /* 2880 */ 1880, 1545, 1545, 1545, 1916, 1545, 1545, 1545, 313, 1881, + /* 2890 */ 1883, 602, 1885, 1886, 597, 1545, 592, 1900, 1545, 1545, + /* 2900 */ 1545, 1545, 1545, 1545, 1545, 599, 1545, 1545, 1545, 1545, + /* 2910 */ 1850, 1882, 598, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + /* 2920 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + /* 2930 */ 1545, 1545, 1545, 1880, 1545, 1545, 1545, 1916, 1545, 1545, + /* 2940 */ 1900, 318, 1881, 1883, 602, 1885, 1886, 597, 599, 592, + /* 2950 */ 1545, 1545, 1545, 1850, 1545, 598, 1545, 1545, 1545, 1545, + /* 2960 */ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + /* 2970 */ 1545, 1545, 1545, 1545, 1545, 1545, 1880, 1545, 1545, 1545, + /* 2980 */ 1916, 1545, 1545, 1545, 293, 1881, 1883, 602, 1885, 1886, + /* 2990 */ 597, 1545, 592, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 350, 0, 323, 350, 325, 326, 323, 319, 325, 326, - /* 10 */ 350, 361, 12, 13, 361, 359, 327, 349, 362, 363, - /* 20 */ 20, 361, 22, 12, 13, 14, 15, 16, 339, 3, - /* 30 */ 14, 15, 16, 33, 4, 35, 348, 387, 388, 389, - /* 40 */ 387, 388, 389, 20, 356, 356, 20, 387, 388, 361, - /* 50 */ 400, 363, 2, 400, 324, 20, 56, 327, 8, 9, - /* 60 */ 400, 61, 12, 13, 14, 15, 16, 319, 68, 12, - /* 70 */ 13, 14, 384, 35, 44, 45, 388, 20, 393, 22, - /* 80 */ 392, 393, 394, 395, 396, 397, 398, 20, 400, 22, - /* 90 */ 33, 319, 35, 405, 94, 407, 348, 362, 363, 411, - /* 100 */ 412, 331, 35, 348, 356, 327, 68, 422, 14, 361, - /* 110 */ 355, 363, 424, 56, 20, 345, 116, 50, 61, 364, - /* 120 */ 432, 95, 437, 438, 354, 68, 0, 442, 443, 94, - /* 130 */ 130, 131, 384, 361, 356, 4, 388, 0, 319, 56, - /* 140 */ 392, 393, 394, 395, 396, 397, 398, 390, 400, 348, - /* 150 */ 329, 94, 20, 130, 131, 407, 94, 356, 21, 411, - /* 160 */ 412, 24, 25, 26, 27, 28, 29, 30, 31, 32, - /* 170 */ 422, 393, 351, 116, 363, 418, 176, 94, 178, 96, - /* 180 */ 361, 370, 408, 409, 373, 437, 438, 130, 131, 163, - /* 190 */ 442, 443, 414, 415, 416, 417, 395, 419, 161, 324, - /* 200 */ 200, 201, 327, 203, 204, 205, 206, 207, 208, 209, + /* 0 */ 351, 0, 324, 351, 326, 327, 324, 320, 326, 327, + /* 10 */ 351, 362, 12, 13, 362, 360, 328, 328, 363, 364, + /* 20 */ 20, 362, 22, 12, 13, 14, 15, 16, 340, 3, + /* 30 */ 409, 410, 20, 33, 20, 35, 349, 388, 389, 390, + /* 40 */ 388, 389, 390, 20, 357, 357, 20, 388, 389, 362, + /* 50 */ 401, 364, 2, 401, 0, 366, 56, 4, 8, 9, + /* 60 */ 401, 61, 12, 13, 14, 15, 16, 320, 68, 12, + /* 70 */ 13, 14, 385, 14, 15, 16, 389, 20, 394, 22, + /* 80 */ 393, 394, 395, 396, 397, 398, 399, 20, 401, 22, + /* 90 */ 33, 4, 35, 406, 94, 408, 349, 44, 45, 412, + /* 100 */ 413, 332, 35, 60, 357, 328, 94, 423, 94, 362, + /* 110 */ 20, 364, 425, 56, 60, 346, 116, 50, 61, 364, + /* 120 */ 433, 95, 438, 439, 355, 68, 371, 443, 444, 374, + /* 130 */ 130, 131, 385, 20, 357, 56, 389, 0, 349, 56, + /* 140 */ 393, 394, 395, 396, 397, 398, 399, 358, 401, 349, + /* 150 */ 20, 94, 22, 130, 131, 408, 94, 357, 21, 412, + /* 160 */ 413, 24, 25, 26, 27, 28, 29, 30, 31, 32, + /* 170 */ 423, 394, 93, 116, 94, 96, 176, 94, 178, 96, + /* 180 */ 50, 94, 0, 320, 94, 438, 439, 130, 131, 163, + /* 190 */ 443, 444, 415, 416, 417, 418, 396, 420, 363, 364, + /* 200 */ 200, 201, 60, 203, 204, 205, 206, 207, 208, 209, /* 210 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - /* 220 */ 220, 221, 222, 20, 33, 94, 94, 329, 158, 318, - /* 230 */ 327, 320, 106, 176, 20, 178, 94, 175, 47, 177, - /* 240 */ 240, 343, 200, 52, 53, 54, 55, 56, 78, 351, - /* 250 */ 14, 125, 126, 127, 128, 129, 20, 200, 201, 356, + /* 220 */ 220, 221, 222, 223, 33, 362, 125, 126, 20, 106, + /* 230 */ 328, 333, 37, 176, 14, 178, 338, 175, 47, 177, + /* 240 */ 20, 241, 60, 52, 53, 54, 55, 56, 125, 126, + /* 250 */ 127, 128, 129, 241, 319, 241, 321, 200, 201, 357, /* 260 */ 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, /* 270 */ 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - /* 280 */ 12, 13, 245, 246, 93, 334, 335, 96, 20, 350, - /* 290 */ 22, 249, 250, 251, 252, 253, 393, 227, 204, 327, - /* 300 */ 361, 33, 240, 35, 134, 135, 21, 237, 94, 24, - /* 310 */ 25, 26, 27, 28, 29, 30, 31, 32, 415, 416, - /* 320 */ 417, 106, 419, 240, 56, 60, 387, 388, 356, 61, - /* 330 */ 393, 224, 319, 226, 327, 171, 68, 12, 13, 400, - /* 340 */ 125, 126, 127, 128, 129, 20, 339, 22, 327, 332, - /* 350 */ 159, 160, 94, 162, 337, 191, 192, 166, 33, 422, - /* 360 */ 35, 348, 94, 356, 20, 393, 327, 393, 404, 356, - /* 370 */ 406, 240, 240, 182, 361, 438, 363, 356, 339, 442, - /* 380 */ 443, 56, 240, 327, 116, 346, 61, 415, 416, 417, - /* 390 */ 126, 419, 20, 68, 22, 356, 422, 384, 130, 131, - /* 400 */ 20, 388, 0, 125, 126, 392, 393, 394, 395, 396, - /* 410 */ 397, 398, 438, 400, 393, 20, 442, 443, 405, 94, - /* 420 */ 407, 365, 50, 327, 411, 412, 24, 25, 26, 27, - /* 430 */ 28, 29, 30, 31, 32, 339, 415, 416, 417, 390, - /* 440 */ 419, 116, 346, 422, 176, 432, 178, 183, 184, 60, - /* 450 */ 348, 187, 356, 20, 240, 130, 131, 355, 437, 438, - /* 460 */ 1, 2, 184, 442, 443, 187, 364, 418, 200, 201, - /* 470 */ 0, 203, 204, 205, 206, 207, 208, 209, 210, 211, - /* 480 */ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - /* 490 */ 222, 125, 224, 14, 404, 316, 406, 37, 240, 20, - /* 500 */ 331, 176, 372, 178, 374, 107, 108, 109, 110, 111, - /* 510 */ 112, 113, 114, 115, 116, 117, 43, 119, 120, 121, - /* 520 */ 122, 123, 124, 354, 105, 200, 201, 56, 203, 204, - /* 530 */ 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - /* 540 */ 215, 216, 217, 218, 219, 220, 221, 222, 12, 13, - /* 550 */ 22, 185, 186, 340, 95, 376, 20, 97, 22, 99, - /* 560 */ 100, 348, 102, 35, 93, 327, 106, 96, 95, 33, - /* 570 */ 357, 35, 393, 0, 376, 390, 106, 339, 8, 9, - /* 580 */ 347, 319, 12, 13, 14, 15, 16, 20, 128, 224, - /* 590 */ 20, 393, 56, 360, 356, 125, 126, 127, 128, 129, - /* 600 */ 319, 422, 327, 418, 68, 12, 13, 14, 334, 335, - /* 610 */ 348, 319, 68, 20, 339, 22, 437, 438, 356, 68, - /* 620 */ 422, 442, 443, 361, 56, 363, 33, 348, 35, 348, - /* 630 */ 94, 356, 21, 60, 355, 437, 438, 356, 3, 327, - /* 640 */ 442, 443, 361, 364, 363, 34, 384, 36, 0, 56, - /* 650 */ 388, 339, 116, 361, 392, 393, 394, 395, 396, 397, - /* 660 */ 398, 68, 400, 340, 96, 384, 130, 131, 356, 388, - /* 670 */ 349, 348, 393, 392, 393, 394, 395, 396, 397, 398, - /* 680 */ 357, 400, 341, 204, 422, 344, 405, 94, 407, 319, - /* 690 */ 8, 9, 411, 412, 12, 13, 14, 15, 16, 437, - /* 700 */ 438, 422, 421, 327, 442, 443, 327, 43, 60, 116, - /* 710 */ 363, 372, 176, 374, 178, 339, 437, 438, 339, 320, - /* 720 */ 373, 442, 443, 130, 131, 348, 358, 356, 319, 361, - /* 730 */ 163, 361, 356, 163, 357, 356, 200, 201, 367, 203, - /* 740 */ 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - /* 750 */ 214, 215, 216, 217, 218, 219, 220, 221, 222, 95, - /* 760 */ 8, 9, 327, 327, 12, 13, 14, 15, 16, 176, - /* 770 */ 361, 178, 340, 349, 339, 339, 240, 95, 8, 9, - /* 780 */ 348, 319, 12, 13, 14, 15, 16, 403, 319, 357, - /* 790 */ 406, 356, 356, 200, 201, 43, 203, 204, 205, 206, - /* 800 */ 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - /* 810 */ 217, 218, 219, 220, 221, 222, 12, 13, 376, 22, - /* 820 */ 356, 319, 348, 361, 20, 358, 22, 319, 361, 3, - /* 830 */ 361, 367, 35, 327, 319, 393, 349, 33, 364, 35, - /* 840 */ 2, 376, 44, 45, 106, 339, 8, 9, 319, 319, - /* 850 */ 12, 13, 14, 15, 16, 336, 39, 338, 393, 327, - /* 860 */ 56, 4, 356, 361, 422, 68, 128, 319, 319, 361, - /* 870 */ 327, 339, 68, 12, 13, 43, 361, 327, 348, 437, - /* 880 */ 438, 20, 339, 22, 442, 443, 356, 422, 356, 339, - /* 890 */ 361, 361, 257, 363, 33, 20, 35, 348, 94, 356, - /* 900 */ 380, 341, 437, 438, 344, 356, 356, 442, 443, 361, - /* 910 */ 361, 20, 363, 116, 384, 0, 319, 56, 388, 327, - /* 920 */ 116, 95, 392, 393, 394, 395, 396, 397, 398, 68, - /* 930 */ 400, 339, 349, 384, 130, 131, 319, 388, 168, 42, - /* 940 */ 43, 392, 393, 394, 395, 396, 397, 398, 356, 400, - /* 950 */ 64, 65, 319, 61, 405, 94, 407, 71, 361, 0, - /* 960 */ 411, 412, 47, 433, 434, 238, 239, 327, 82, 83, - /* 970 */ 421, 0, 327, 176, 88, 178, 35, 116, 361, 339, - /* 980 */ 176, 22, 178, 376, 339, 319, 98, 98, 319, 101, - /* 990 */ 101, 130, 131, 349, 361, 43, 356, 200, 201, 319, - /* 1000 */ 393, 356, 163, 164, 200, 201, 319, 203, 204, 205, - /* 1010 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - /* 1020 */ 216, 217, 218, 219, 220, 221, 222, 361, 327, 422, - /* 1030 */ 361, 327, 262, 130, 131, 64, 65, 176, 163, 178, - /* 1040 */ 339, 361, 71, 339, 437, 438, 43, 95, 361, 442, - /* 1050 */ 443, 349, 43, 82, 83, 98, 239, 356, 101, 88, - /* 1060 */ 356, 200, 201, 0, 203, 204, 205, 206, 207, 208, - /* 1070 */ 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - /* 1080 */ 219, 220, 221, 222, 18, 327, 20, 98, 1, 2, - /* 1090 */ 101, 259, 200, 27, 35, 204, 30, 339, 241, 0, - /* 1100 */ 0, 94, 8, 9, 95, 391, 12, 13, 14, 15, - /* 1110 */ 16, 104, 337, 47, 356, 49, 43, 51, 43, 178, - /* 1120 */ 43, 22, 22, 446, 43, 43, 63, 64, 65, 66, - /* 1130 */ 67, 43, 69, 70, 71, 72, 73, 74, 75, 76, - /* 1140 */ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - /* 1150 */ 87, 88, 89, 90, 435, 18, 328, 8, 9, 93, - /* 1160 */ 23, 12, 13, 14, 15, 16, 429, 35, 95, 13, - /* 1170 */ 95, 105, 95, 43, 37, 38, 95, 95, 41, 46, - /* 1180 */ 8, 9, 348, 95, 12, 13, 14, 15, 16, 95, - /* 1190 */ 43, 35, 328, 326, 57, 58, 59, 43, 391, 133, - /* 1200 */ 68, 319, 136, 137, 138, 139, 140, 141, 142, 143, - /* 1210 */ 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - /* 1220 */ 43, 155, 156, 157, 13, 95, 360, 94, 8, 9, - /* 1230 */ 348, 94, 12, 13, 14, 15, 16, 178, 356, 43, - /* 1240 */ 43, 420, 95, 361, 439, 363, 35, 0, 413, 95, - /* 1250 */ 423, 386, 242, 47, 385, 378, 42, 174, 368, 20, - /* 1260 */ 327, 327, 368, 158, 261, 366, 384, 366, 92, 132, - /* 1270 */ 388, 333, 95, 327, 392, 393, 394, 395, 396, 397, - /* 1280 */ 398, 61, 400, 327, 20, 403, 321, 405, 406, 407, - /* 1290 */ 327, 95, 95, 411, 412, 48, 321, 20, 382, 331, - /* 1300 */ 376, 331, 363, 20, 375, 168, 169, 170, 20, 377, - /* 1310 */ 173, 319, 163, 331, 331, 375, 4, 393, 331, 331, - /* 1320 */ 327, 331, 321, 103, 348, 348, 348, 190, 348, 348, - /* 1330 */ 193, 19, 195, 196, 197, 198, 199, 321, 327, 348, - /* 1340 */ 348, 189, 348, 348, 348, 33, 422, 348, 356, 383, - /* 1350 */ 348, 382, 329, 361, 181, 363, 329, 327, 361, 47, - /* 1360 */ 381, 437, 438, 51, 327, 329, 442, 443, 56, 363, - /* 1370 */ 247, 371, 160, 375, 361, 361, 384, 240, 158, 361, - /* 1380 */ 388, 361, 361, 371, 392, 393, 394, 395, 396, 397, - /* 1390 */ 398, 369, 400, 319, 329, 344, 329, 405, 356, 407, - /* 1400 */ 20, 361, 428, 411, 412, 93, 391, 248, 96, 371, - /* 1410 */ 391, 361, 428, 421, 361, 371, 361, 361, 254, 167, - /* 1420 */ 263, 256, 348, 255, 243, 386, 260, 441, 258, 239, - /* 1430 */ 356, 20, 447, 425, 430, 361, 431, 363, 390, 94, - /* 1440 */ 356, 410, 94, 352, 338, 428, 319, 227, 228, 229, - /* 1450 */ 230, 231, 232, 233, 234, 235, 236, 237, 384, 427, - /* 1460 */ 426, 327, 388, 361, 440, 329, 392, 393, 394, 395, - /* 1470 */ 396, 397, 398, 36, 400, 348, 379, 322, 374, 405, - /* 1480 */ 342, 407, 321, 356, 342, 411, 412, 342, 361, 0, - /* 1490 */ 363, 317, 330, 0, 183, 0, 0, 42, 0, 35, - /* 1500 */ 194, 35, 35, 35, 194, 0, 35, 35, 194, 0, - /* 1510 */ 194, 384, 0, 35, 319, 388, 0, 0, 35, 392, - /* 1520 */ 393, 394, 395, 396, 397, 398, 22, 400, 178, 176, - /* 1530 */ 0, 0, 405, 172, 407, 171, 319, 0, 411, 412, - /* 1540 */ 12, 13, 0, 348, 42, 46, 0, 0, 0, 0, - /* 1550 */ 22, 356, 0, 0, 154, 0, 361, 0, 363, 0, - /* 1560 */ 0, 33, 0, 35, 149, 348, 0, 35, 149, 0, - /* 1570 */ 0, 0, 0, 356, 0, 0, 0, 0, 361, 384, - /* 1580 */ 363, 0, 0, 388, 56, 0, 0, 392, 393, 394, - /* 1590 */ 395, 396, 397, 398, 319, 400, 68, 0, 0, 0, - /* 1600 */ 405, 384, 407, 42, 0, 388, 411, 412, 0, 392, - /* 1610 */ 393, 394, 395, 396, 397, 398, 0, 400, 0, 0, - /* 1620 */ 19, 0, 22, 348, 407, 0, 0, 0, 411, 412, - /* 1630 */ 0, 356, 0, 0, 33, 56, 361, 35, 363, 56, - /* 1640 */ 0, 0, 14, 14, 116, 42, 39, 0, 47, 43, - /* 1650 */ 40, 46, 39, 52, 53, 54, 55, 56, 0, 384, - /* 1660 */ 46, 0, 39, 388, 167, 0, 0, 392, 393, 394, - /* 1670 */ 395, 396, 397, 398, 0, 400, 0, 62, 0, 35, - /* 1680 */ 0, 47, 407, 35, 39, 47, 411, 412, 39, 0, - /* 1690 */ 35, 39, 0, 47, 93, 35, 319, 96, 47, 0, - /* 1700 */ 0, 39, 0, 0, 176, 35, 178, 22, 0, 22, - /* 1710 */ 35, 43, 103, 0, 35, 43, 35, 35, 101, 0, - /* 1720 */ 22, 0, 49, 22, 0, 348, 22, 0, 200, 201, - /* 1730 */ 129, 35, 0, 356, 22, 0, 20, 95, 361, 0, - /* 1740 */ 363, 213, 214, 215, 216, 217, 218, 219, 94, 35, - /* 1750 */ 35, 163, 35, 22, 163, 319, 160, 179, 0, 0, - /* 1760 */ 3, 384, 0, 162, 0, 388, 0, 0, 35, 392, - /* 1770 */ 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - /* 1780 */ 94, 180, 188, 182, 348, 163, 95, 94, 94, 165, - /* 1790 */ 0, 39, 356, 46, 104, 159, 161, 361, 43, 363, - /* 1800 */ 94, 94, 244, 223, 43, 95, 95, 244, 43, 225, - /* 1810 */ 319, 43, 223, 95, 94, 46, 94, 46, 95, 94, - /* 1820 */ 384, 95, 94, 94, 388, 43, 3, 43, 392, 393, - /* 1830 */ 394, 395, 396, 397, 398, 94, 400, 95, 95, 348, - /* 1840 */ 35, 35, 35, 35, 35, 35, 95, 356, 95, 46, - /* 1850 */ 46, 2, 361, 200, 363, 244, 43, 22, 238, 22, - /* 1860 */ 46, 46, 46, 319, 94, 202, 22, 95, 94, 35, - /* 1870 */ 95, 94, 118, 95, 94, 384, 95, 94, 105, 388, - /* 1880 */ 444, 445, 94, 392, 393, 394, 395, 396, 397, 398, - /* 1890 */ 95, 400, 348, 35, 94, 35, 95, 353, 407, 35, - /* 1900 */ 356, 35, 106, 412, 35, 361, 94, 363, 35, 118, - /* 1910 */ 118, 118, 95, 94, 319, 95, 94, 43, 22, 95, - /* 1920 */ 94, 94, 94, 94, 62, 35, 61, 35, 384, 35, - /* 1930 */ 35, 319, 388, 35, 91, 35, 392, 393, 394, 395, - /* 1940 */ 396, 397, 398, 348, 400, 35, 35, 35, 35, 68, - /* 1950 */ 43, 356, 35, 35, 22, 35, 361, 22, 363, 35, - /* 1960 */ 348, 35, 35, 35, 35, 68, 35, 22, 356, 35, - /* 1970 */ 0, 35, 35, 361, 35, 363, 0, 47, 35, 384, - /* 1980 */ 39, 0, 0, 388, 35, 47, 39, 392, 393, 394, - /* 1990 */ 395, 396, 397, 398, 39, 400, 384, 402, 47, 35, - /* 2000 */ 388, 47, 39, 0, 392, 393, 394, 395, 396, 397, - /* 2010 */ 398, 0, 400, 35, 35, 21, 319, 22, 22, 22, - /* 2020 */ 21, 20, 448, 448, 448, 448, 448, 448, 448, 448, - /* 2030 */ 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, - /* 2040 */ 448, 448, 448, 448, 448, 348, 434, 448, 448, 448, - /* 2050 */ 448, 448, 448, 356, 448, 448, 448, 448, 361, 448, - /* 2060 */ 363, 448, 448, 448, 448, 448, 448, 319, 448, 448, - /* 2070 */ 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, - /* 2080 */ 448, 384, 448, 448, 448, 388, 448, 448, 448, 392, - /* 2090 */ 393, 394, 395, 396, 397, 398, 348, 400, 448, 448, - /* 2100 */ 448, 448, 448, 448, 356, 448, 448, 448, 448, 361, - /* 2110 */ 448, 363, 448, 448, 448, 448, 448, 448, 448, 448, - /* 2120 */ 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, - /* 2130 */ 319, 448, 384, 436, 448, 448, 388, 448, 448, 448, - /* 2140 */ 392, 393, 394, 395, 396, 397, 398, 448, 400, 448, - /* 2150 */ 319, 448, 448, 448, 448, 448, 448, 448, 448, 348, - /* 2160 */ 448, 448, 448, 448, 353, 448, 448, 356, 448, 448, - /* 2170 */ 448, 448, 361, 448, 363, 448, 448, 448, 448, 348, - /* 2180 */ 448, 448, 448, 448, 353, 448, 448, 356, 448, 448, - /* 2190 */ 448, 448, 361, 445, 363, 384, 448, 448, 448, 388, - /* 2200 */ 448, 319, 448, 392, 393, 394, 395, 396, 397, 398, - /* 2210 */ 448, 400, 448, 448, 448, 384, 448, 448, 319, 388, - /* 2220 */ 448, 448, 448, 392, 393, 394, 395, 396, 397, 398, - /* 2230 */ 348, 400, 448, 448, 448, 448, 448, 448, 356, 448, - /* 2240 */ 448, 448, 448, 361, 448, 363, 448, 348, 448, 448, - /* 2250 */ 448, 448, 448, 448, 448, 356, 448, 448, 448, 448, - /* 2260 */ 361, 319, 363, 448, 448, 448, 384, 448, 448, 448, - /* 2270 */ 388, 448, 448, 448, 392, 393, 394, 395, 396, 397, - /* 2280 */ 398, 448, 400, 384, 448, 448, 448, 388, 448, 448, - /* 2290 */ 348, 392, 393, 394, 395, 396, 397, 398, 356, 400, - /* 2300 */ 448, 448, 448, 361, 448, 363, 448, 448, 448, 448, - /* 2310 */ 448, 448, 319, 448, 448, 448, 448, 448, 448, 448, - /* 2320 */ 448, 448, 448, 448, 448, 448, 384, 448, 448, 319, - /* 2330 */ 388, 448, 448, 448, 392, 393, 394, 395, 396, 397, - /* 2340 */ 398, 348, 400, 448, 448, 448, 448, 448, 448, 356, - /* 2350 */ 448, 448, 448, 448, 361, 448, 363, 448, 348, 448, - /* 2360 */ 448, 448, 448, 448, 448, 448, 356, 448, 448, 448, - /* 2370 */ 448, 361, 448, 363, 448, 448, 448, 384, 448, 448, - /* 2380 */ 319, 388, 448, 448, 448, 392, 393, 394, 395, 396, - /* 2390 */ 397, 398, 448, 400, 384, 448, 448, 448, 388, 448, - /* 2400 */ 448, 448, 392, 393, 394, 395, 396, 397, 398, 348, - /* 2410 */ 400, 448, 448, 448, 448, 448, 448, 356, 448, 448, - /* 2420 */ 448, 448, 361, 448, 363, 448, 448, 448, 448, 448, - /* 2430 */ 448, 319, 448, 448, 448, 448, 448, 448, 448, 448, - /* 2440 */ 448, 448, 448, 448, 448, 384, 448, 448, 448, 388, - /* 2450 */ 319, 448, 448, 392, 393, 394, 395, 396, 397, 398, - /* 2460 */ 348, 400, 448, 448, 448, 448, 448, 448, 356, 448, - /* 2470 */ 448, 448, 448, 361, 448, 363, 448, 448, 448, 348, - /* 2480 */ 448, 448, 448, 448, 448, 448, 448, 356, 448, 448, - /* 2490 */ 448, 448, 361, 448, 363, 448, 384, 448, 448, 448, - /* 2500 */ 388, 448, 448, 448, 392, 393, 394, 395, 396, 397, - /* 2510 */ 398, 448, 400, 319, 448, 384, 448, 448, 448, 388, - /* 2520 */ 448, 448, 448, 392, 393, 394, 395, 396, 397, 398, - /* 2530 */ 448, 400, 448, 448, 448, 319, 448, 448, 448, 448, - /* 2540 */ 448, 448, 348, 448, 448, 448, 448, 448, 448, 448, - /* 2550 */ 356, 448, 448, 448, 448, 361, 448, 363, 448, 448, - /* 2560 */ 448, 448, 448, 448, 348, 448, 448, 448, 448, 448, - /* 2570 */ 448, 448, 356, 448, 448, 448, 448, 361, 384, 363, - /* 2580 */ 448, 448, 388, 448, 448, 448, 392, 393, 394, 395, - /* 2590 */ 396, 397, 398, 448, 400, 319, 448, 448, 448, 448, - /* 2600 */ 384, 448, 448, 448, 388, 448, 448, 448, 392, 393, - /* 2610 */ 394, 395, 396, 397, 398, 319, 400, 448, 448, 448, - /* 2620 */ 448, 448, 448, 448, 348, 448, 448, 448, 448, 448, - /* 2630 */ 448, 448, 356, 448, 448, 448, 448, 361, 448, 363, - /* 2640 */ 448, 448, 448, 448, 348, 448, 448, 448, 448, 448, - /* 2650 */ 448, 448, 356, 448, 448, 448, 448, 361, 319, 363, - /* 2660 */ 384, 448, 448, 448, 388, 448, 448, 448, 392, 393, - /* 2670 */ 394, 395, 396, 397, 398, 448, 400, 448, 319, 448, - /* 2680 */ 384, 448, 448, 448, 388, 448, 448, 348, 392, 393, - /* 2690 */ 394, 395, 396, 397, 398, 356, 400, 448, 448, 448, - /* 2700 */ 361, 448, 363, 448, 448, 448, 448, 348, 448, 448, - /* 2710 */ 448, 448, 448, 448, 448, 356, 448, 448, 448, 448, - /* 2720 */ 361, 448, 363, 384, 448, 448, 448, 388, 448, 319, - /* 2730 */ 448, 392, 393, 394, 395, 396, 397, 398, 448, 400, - /* 2740 */ 448, 448, 448, 384, 448, 448, 448, 388, 448, 448, - /* 2750 */ 448, 392, 393, 394, 395, 396, 397, 398, 348, 400, - /* 2760 */ 448, 448, 448, 448, 448, 448, 356, 448, 448, 448, - /* 2770 */ 448, 361, 448, 363, 448, 448, 448, 448, 448, 448, - /* 2780 */ 319, 448, 448, 448, 448, 448, 448, 448, 448, 448, - /* 2790 */ 448, 448, 448, 448, 384, 448, 448, 448, 388, 319, - /* 2800 */ 448, 448, 392, 393, 394, 395, 396, 397, 398, 348, - /* 2810 */ 400, 448, 448, 448, 448, 448, 448, 356, 448, 448, - /* 2820 */ 448, 448, 361, 448, 363, 448, 448, 448, 348, 448, - /* 2830 */ 448, 448, 448, 448, 448, 448, 356, 448, 448, 448, - /* 2840 */ 448, 361, 448, 363, 448, 384, 448, 448, 448, 388, - /* 2850 */ 448, 448, 448, 392, 393, 394, 395, 396, 397, 398, - /* 2860 */ 448, 400, 319, 448, 384, 448, 448, 448, 388, 448, - /* 2870 */ 448, 448, 392, 393, 394, 395, 396, 397, 398, 448, - /* 2880 */ 400, 448, 448, 448, 319, 448, 448, 448, 448, 448, - /* 2890 */ 448, 348, 448, 448, 448, 448, 448, 448, 448, 356, - /* 2900 */ 448, 448, 448, 448, 361, 448, 363, 448, 448, 448, - /* 2910 */ 448, 448, 448, 348, 448, 448, 448, 448, 448, 448, - /* 2920 */ 448, 356, 448, 448, 448, 448, 361, 384, 363, 448, - /* 2930 */ 448, 388, 448, 448, 448, 392, 393, 394, 395, 396, - /* 2940 */ 397, 398, 448, 400, 319, 448, 448, 448, 448, 384, - /* 2950 */ 448, 448, 448, 388, 448, 448, 448, 392, 393, 394, - /* 2960 */ 395, 396, 397, 398, 319, 400, 448, 448, 448, 448, - /* 2970 */ 448, 448, 448, 348, 448, 448, 448, 448, 448, 448, - /* 2980 */ 448, 356, 448, 448, 448, 448, 361, 448, 363, 448, - /* 2990 */ 448, 448, 448, 348, 448, 448, 448, 448, 448, 448, - /* 3000 */ 448, 356, 448, 448, 448, 448, 361, 448, 363, 384, - /* 3010 */ 448, 448, 448, 388, 448, 448, 448, 392, 393, 394, - /* 3020 */ 395, 396, 397, 398, 448, 400, 448, 448, 448, 384, - /* 3030 */ 448, 448, 448, 388, 448, 448, 448, 392, 393, 394, - /* 3040 */ 395, 396, 397, 398, 448, 400, + /* 280 */ 223, 12, 13, 126, 93, 184, 348, 96, 187, 20, + /* 290 */ 341, 22, 97, 320, 99, 100, 394, 102, 349, 361, + /* 300 */ 328, 106, 33, 241, 35, 320, 21, 358, 20, 24, + /* 310 */ 25, 26, 27, 28, 29, 30, 31, 32, 416, 417, + /* 320 */ 418, 241, 420, 128, 241, 56, 20, 349, 241, 357, + /* 330 */ 61, 351, 161, 320, 356, 362, 125, 68, 12, 13, + /* 340 */ 183, 184, 362, 365, 187, 357, 20, 362, 22, 328, + /* 350 */ 159, 160, 94, 162, 14, 328, 368, 166, 330, 33, + /* 360 */ 20, 35, 349, 94, 328, 14, 394, 340, 388, 389, + /* 370 */ 357, 20, 344, 182, 347, 362, 340, 364, 357, 349, + /* 380 */ 352, 401, 56, 347, 357, 116, 356, 61, 416, 417, + /* 390 */ 418, 22, 420, 357, 68, 365, 185, 186, 385, 130, + /* 400 */ 131, 200, 389, 0, 35, 341, 393, 394, 395, 396, + /* 410 */ 397, 398, 399, 349, 401, 394, 35, 246, 247, 406, + /* 420 */ 94, 408, 358, 158, 204, 412, 413, 24, 25, 26, + /* 430 */ 27, 28, 29, 30, 31, 32, 3, 416, 417, 418, + /* 440 */ 78, 420, 116, 332, 423, 176, 433, 178, 21, 68, + /* 450 */ 341, 250, 251, 252, 253, 254, 130, 131, 349, 438, + /* 460 */ 439, 34, 20, 36, 443, 444, 355, 358, 20, 200, + /* 470 */ 201, 0, 203, 204, 205, 206, 207, 208, 209, 210, + /* 480 */ 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + /* 490 */ 221, 222, 223, 228, 225, 325, 134, 135, 328, 241, + /* 500 */ 335, 336, 176, 238, 178, 68, 107, 108, 109, 110, + /* 510 */ 111, 112, 113, 114, 115, 116, 117, 320, 119, 120, + /* 520 */ 121, 122, 123, 124, 391, 394, 200, 201, 95, 203, + /* 530 */ 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + /* 540 */ 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + /* 550 */ 12, 13, 419, 328, 423, 204, 335, 336, 20, 362, + /* 560 */ 22, 225, 35, 227, 328, 340, 328, 105, 320, 325, + /* 570 */ 439, 33, 328, 35, 443, 444, 340, 106, 340, 320, + /* 580 */ 8, 9, 357, 320, 12, 13, 14, 15, 16, 328, + /* 590 */ 1, 2, 20, 357, 56, 357, 125, 126, 127, 128, + /* 600 */ 129, 340, 320, 0, 328, 163, 68, 12, 13, 14, + /* 610 */ 362, 328, 349, 320, 328, 20, 340, 22, 357, 391, + /* 620 */ 357, 362, 349, 340, 320, 362, 340, 364, 33, 349, + /* 630 */ 35, 349, 94, 357, 225, 405, 356, 407, 365, 357, + /* 640 */ 357, 328, 56, 357, 362, 365, 364, 419, 385, 320, + /* 650 */ 330, 56, 389, 340, 116, 362, 393, 394, 395, 396, + /* 660 */ 397, 398, 399, 68, 401, 68, 362, 385, 130, 131, + /* 670 */ 357, 389, 352, 320, 394, 393, 394, 395, 396, 397, + /* 680 */ 398, 399, 96, 401, 95, 373, 423, 375, 406, 94, + /* 690 */ 408, 362, 8, 9, 412, 413, 12, 13, 14, 15, + /* 700 */ 16, 438, 439, 423, 422, 178, 443, 444, 328, 106, + /* 710 */ 405, 116, 407, 171, 176, 362, 178, 317, 438, 439, + /* 720 */ 340, 44, 45, 443, 444, 130, 131, 43, 125, 126, + /* 730 */ 127, 128, 129, 191, 192, 163, 320, 357, 200, 201, + /* 740 */ 350, 203, 204, 205, 206, 207, 208, 209, 210, 211, + /* 750 */ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + /* 760 */ 222, 223, 8, 9, 328, 350, 12, 13, 14, 15, + /* 770 */ 16, 176, 342, 178, 357, 345, 340, 377, 362, 241, + /* 780 */ 3, 20, 8, 9, 320, 368, 12, 13, 14, 15, + /* 790 */ 16, 0, 320, 357, 394, 200, 201, 39, 203, 204, + /* 800 */ 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + /* 810 */ 215, 216, 217, 218, 219, 220, 221, 222, 223, 12, + /* 820 */ 13, 328, 22, 423, 320, 320, 362, 20, 43, 22, + /* 830 */ 320, 364, 350, 340, 362, 35, 328, 35, 438, 439, + /* 840 */ 33, 374, 35, 443, 444, 350, 320, 2, 340, 95, + /* 850 */ 357, 4, 320, 8, 9, 64, 65, 12, 13, 14, + /* 860 */ 15, 16, 71, 56, 320, 357, 362, 362, 68, 394, + /* 870 */ 68, 320, 362, 82, 83, 68, 12, 13, 328, 88, + /* 880 */ 328, 349, 391, 328, 20, 373, 22, 375, 362, 357, + /* 890 */ 340, 357, 340, 328, 362, 340, 364, 33, 423, 35, + /* 900 */ 349, 94, 368, 239, 240, 340, 362, 357, 357, 357, + /* 910 */ 419, 20, 357, 362, 439, 364, 116, 385, 443, 444, + /* 920 */ 56, 389, 357, 116, 163, 393, 394, 395, 396, 397, + /* 930 */ 398, 399, 68, 401, 106, 350, 385, 130, 131, 320, + /* 940 */ 389, 328, 168, 328, 393, 394, 395, 396, 397, 398, + /* 950 */ 399, 404, 401, 340, 407, 340, 128, 406, 94, 408, + /* 960 */ 337, 350, 339, 412, 413, 359, 434, 435, 362, 381, + /* 970 */ 357, 359, 357, 422, 362, 0, 176, 350, 178, 342, + /* 980 */ 116, 362, 345, 176, 43, 178, 42, 43, 98, 105, + /* 990 */ 98, 101, 43, 101, 130, 131, 98, 22, 240, 101, + /* 1000 */ 200, 201, 0, 98, 163, 164, 101, 200, 201, 0, + /* 1010 */ 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + /* 1020 */ 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + /* 1030 */ 223, 22, 130, 131, 43, 258, 95, 263, 154, 35, + /* 1040 */ 176, 43, 178, 321, 95, 260, 8, 9, 61, 47, + /* 1050 */ 12, 13, 14, 15, 16, 8, 9, 43, 392, 12, + /* 1060 */ 13, 14, 15, 16, 200, 201, 0, 203, 204, 205, + /* 1070 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + /* 1080 */ 216, 217, 218, 219, 220, 221, 222, 223, 18, 242, + /* 1090 */ 20, 1, 2, 95, 94, 204, 0, 27, 447, 436, + /* 1100 */ 30, 13, 13, 338, 104, 329, 8, 9, 43, 95, + /* 1110 */ 12, 13, 14, 15, 16, 43, 43, 47, 22, 49, + /* 1120 */ 43, 51, 43, 35, 35, 0, 430, 43, 349, 63, + /* 1130 */ 64, 65, 66, 67, 43, 69, 70, 71, 72, 73, + /* 1140 */ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + /* 1150 */ 84, 85, 86, 87, 88, 89, 90, 18, 329, 327, + /* 1160 */ 95, 392, 23, 93, 361, 421, 440, 95, 95, 414, + /* 1170 */ 424, 243, 95, 48, 95, 105, 37, 38, 377, 95, + /* 1180 */ 41, 387, 178, 46, 43, 43, 95, 200, 379, 43, + /* 1190 */ 47, 43, 386, 95, 43, 394, 57, 58, 59, 174, + /* 1200 */ 42, 163, 369, 133, 369, 320, 136, 137, 138, 139, + /* 1210 */ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + /* 1220 */ 150, 151, 152, 153, 423, 155, 156, 157, 20, 328, + /* 1230 */ 369, 94, 328, 94, 349, 367, 95, 95, 158, 438, + /* 1240 */ 439, 95, 357, 95, 443, 444, 95, 362, 367, 364, + /* 1250 */ 334, 8, 9, 262, 92, 12, 13, 14, 15, 16, + /* 1260 */ 328, 20, 328, 328, 322, 322, 20, 364, 332, 383, + /* 1270 */ 385, 132, 332, 20, 389, 376, 20, 332, 393, 394, + /* 1280 */ 395, 396, 397, 398, 399, 378, 401, 64, 65, 404, + /* 1290 */ 376, 406, 407, 408, 71, 332, 332, 412, 413, 332, + /* 1300 */ 328, 377, 332, 377, 61, 82, 83, 168, 169, 170, + /* 1310 */ 377, 88, 173, 328, 322, 349, 320, 349, 394, 322, + /* 1320 */ 394, 362, 349, 349, 189, 349, 349, 394, 349, 190, + /* 1330 */ 349, 349, 193, 383, 195, 196, 197, 198, 199, 349, + /* 1340 */ 384, 330, 349, 382, 181, 349, 103, 423, 330, 423, + /* 1350 */ 364, 328, 328, 357, 376, 248, 423, 330, 362, 160, + /* 1360 */ 364, 377, 438, 439, 438, 439, 372, 443, 444, 443, + /* 1370 */ 444, 438, 439, 372, 362, 362, 443, 444, 394, 362, + /* 1380 */ 241, 385, 362, 362, 330, 389, 370, 345, 330, 393, + /* 1390 */ 394, 395, 396, 397, 398, 399, 357, 401, 20, 392, + /* 1400 */ 392, 158, 406, 362, 408, 249, 372, 423, 412, 413, + /* 1410 */ 19, 362, 429, 362, 362, 372, 255, 429, 422, 362, + /* 1420 */ 431, 320, 438, 439, 33, 167, 257, 443, 444, 256, + /* 1430 */ 244, 432, 429, 428, 264, 387, 261, 427, 47, 259, + /* 1440 */ 240, 426, 357, 52, 53, 54, 55, 56, 20, 94, + /* 1450 */ 349, 391, 94, 353, 448, 411, 362, 339, 357, 328, + /* 1460 */ 330, 442, 36, 362, 320, 364, 380, 441, 323, 322, + /* 1470 */ 375, 228, 229, 230, 231, 232, 233, 234, 235, 236, + /* 1480 */ 237, 238, 318, 343, 93, 331, 385, 96, 0, 0, + /* 1490 */ 389, 183, 343, 349, 393, 394, 395, 396, 397, 398, + /* 1500 */ 399, 357, 401, 343, 0, 0, 362, 406, 364, 408, + /* 1510 */ 42, 12, 13, 412, 413, 0, 35, 320, 194, 35, + /* 1520 */ 129, 22, 35, 194, 0, 35, 35, 35, 194, 385, + /* 1530 */ 0, 194, 33, 389, 35, 0, 35, 393, 394, 395, + /* 1540 */ 396, 397, 398, 399, 35, 401, 349, 0, 22, 0, + /* 1550 */ 406, 178, 408, 162, 357, 56, 412, 413, 176, 362, + /* 1560 */ 0, 364, 0, 0, 172, 171, 0, 68, 0, 46, + /* 1570 */ 320, 180, 0, 182, 0, 42, 0, 0, 0, 42, + /* 1580 */ 0, 0, 385, 0, 0, 0, 389, 0, 149, 35, + /* 1590 */ 393, 394, 395, 396, 397, 398, 399, 0, 401, 349, + /* 1600 */ 149, 0, 0, 406, 22, 408, 0, 357, 0, 412, + /* 1610 */ 413, 0, 362, 320, 364, 116, 0, 0, 0, 0, + /* 1620 */ 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, + /* 1630 */ 0, 0, 0, 0, 0, 385, 0, 0, 35, 389, + /* 1640 */ 0, 0, 349, 393, 394, 395, 396, 397, 398, 399, + /* 1650 */ 357, 401, 56, 0, 56, 362, 42, 364, 408, 14, + /* 1660 */ 14, 46, 412, 413, 167, 0, 320, 39, 0, 0, + /* 1670 */ 0, 0, 0, 0, 39, 176, 0, 178, 385, 0, + /* 1680 */ 0, 43, 389, 40, 35, 46, 393, 394, 395, 396, + /* 1690 */ 397, 398, 399, 39, 401, 349, 39, 47, 35, 200, + /* 1700 */ 201, 408, 47, 357, 62, 412, 413, 0, 362, 35, + /* 1710 */ 364, 0, 0, 214, 215, 216, 217, 218, 219, 220, + /* 1720 */ 39, 39, 320, 35, 47, 47, 39, 0, 0, 0, + /* 1730 */ 35, 385, 22, 0, 35, 389, 35, 43, 35, 393, + /* 1740 */ 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + /* 1750 */ 35, 349, 43, 101, 103, 0, 22, 22, 0, 357, + /* 1760 */ 22, 0, 49, 22, 362, 35, 364, 0, 0, 0, + /* 1770 */ 22, 20, 35, 0, 35, 163, 0, 35, 95, 94, + /* 1780 */ 0, 22, 0, 0, 320, 94, 179, 385, 0, 4, + /* 1790 */ 3, 389, 0, 95, 0, 393, 394, 395, 396, 397, + /* 1800 */ 398, 399, 94, 401, 19, 35, 0, 163, 160, 104, + /* 1810 */ 94, 39, 46, 349, 94, 224, 226, 43, 33, 163, + /* 1820 */ 161, 357, 43, 165, 224, 159, 362, 95, 364, 43, + /* 1830 */ 46, 3, 47, 245, 94, 46, 51, 94, 43, 95, + /* 1840 */ 95, 56, 320, 94, 43, 95, 94, 445, 446, 385, + /* 1850 */ 188, 94, 43, 389, 94, 245, 94, 393, 394, 395, + /* 1860 */ 396, 397, 398, 399, 320, 401, 95, 35, 35, 35, + /* 1870 */ 95, 349, 408, 95, 35, 35, 354, 413, 93, 357, + /* 1880 */ 35, 96, 46, 46, 362, 95, 364, 43, 95, 46, + /* 1890 */ 2, 22, 200, 349, 94, 46, 46, 95, 94, 94, + /* 1900 */ 239, 357, 95, 95, 94, 245, 362, 385, 364, 94, + /* 1910 */ 94, 389, 95, 22, 95, 393, 394, 395, 396, 397, + /* 1920 */ 398, 399, 35, 401, 320, 202, 105, 35, 35, 385, + /* 1930 */ 95, 35, 94, 389, 35, 94, 94, 393, 394, 395, + /* 1940 */ 396, 397, 398, 399, 35, 401, 95, 403, 95, 94, + /* 1950 */ 22, 95, 94, 349, 106, 94, 94, 35, 94, 43, + /* 1960 */ 22, 357, 62, 61, 118, 118, 362, 320, 364, 35, + /* 1970 */ 118, 35, 118, 68, 35, 35, 35, 35, 35, 35, + /* 1980 */ 35, 35, 22, 22, 320, 91, 35, 35, 35, 385, + /* 1990 */ 43, 35, 35, 389, 35, 68, 349, 393, 394, 395, + /* 2000 */ 396, 397, 398, 399, 357, 401, 35, 35, 35, 362, + /* 2010 */ 35, 364, 35, 349, 22, 35, 0, 35, 39, 0, + /* 2020 */ 35, 357, 39, 47, 0, 47, 362, 39, 364, 35, + /* 2030 */ 0, 47, 385, 35, 47, 39, 389, 0, 320, 435, + /* 2040 */ 393, 394, 395, 396, 397, 398, 399, 35, 401, 385, + /* 2050 */ 35, 0, 21, 389, 22, 22, 320, 393, 394, 395, + /* 2060 */ 396, 397, 398, 399, 22, 401, 21, 349, 20, 449, + /* 2070 */ 449, 449, 354, 449, 449, 357, 449, 449, 449, 449, + /* 2080 */ 362, 449, 364, 449, 437, 349, 449, 449, 449, 449, + /* 2090 */ 354, 449, 449, 357, 449, 449, 449, 449, 362, 449, + /* 2100 */ 364, 449, 449, 385, 449, 449, 449, 389, 449, 449, + /* 2110 */ 446, 393, 394, 395, 396, 397, 398, 399, 320, 401, + /* 2120 */ 449, 385, 449, 449, 449, 389, 449, 449, 449, 393, + /* 2130 */ 394, 395, 396, 397, 398, 399, 449, 401, 449, 449, + /* 2140 */ 449, 449, 320, 449, 449, 449, 449, 349, 449, 449, + /* 2150 */ 449, 449, 449, 449, 449, 357, 449, 449, 449, 449, + /* 2160 */ 362, 449, 364, 449, 449, 449, 449, 449, 449, 449, + /* 2170 */ 449, 349, 449, 449, 449, 449, 449, 449, 449, 357, + /* 2180 */ 449, 449, 449, 385, 362, 320, 364, 389, 449, 449, + /* 2190 */ 449, 393, 394, 395, 396, 397, 398, 399, 449, 401, + /* 2200 */ 449, 449, 449, 449, 449, 320, 449, 385, 449, 449, + /* 2210 */ 449, 389, 449, 449, 349, 393, 394, 395, 396, 397, + /* 2220 */ 398, 399, 357, 401, 449, 449, 449, 362, 449, 364, + /* 2230 */ 449, 449, 449, 449, 349, 449, 449, 449, 449, 449, + /* 2240 */ 449, 449, 357, 449, 449, 449, 449, 362, 449, 364, + /* 2250 */ 385, 449, 449, 449, 389, 449, 449, 449, 393, 394, + /* 2260 */ 395, 396, 397, 398, 399, 449, 401, 449, 320, 449, + /* 2270 */ 385, 449, 449, 449, 389, 449, 449, 449, 393, 394, + /* 2280 */ 395, 396, 397, 398, 399, 449, 401, 320, 449, 449, + /* 2290 */ 449, 449, 449, 449, 449, 449, 449, 349, 449, 449, + /* 2300 */ 449, 449, 449, 449, 449, 357, 449, 449, 449, 449, + /* 2310 */ 362, 449, 364, 449, 449, 449, 349, 449, 449, 449, + /* 2320 */ 449, 449, 449, 449, 357, 449, 449, 449, 449, 362, + /* 2330 */ 320, 364, 449, 385, 449, 449, 449, 389, 449, 449, + /* 2340 */ 449, 393, 394, 395, 396, 397, 398, 399, 449, 401, + /* 2350 */ 449, 449, 385, 449, 449, 449, 389, 449, 449, 349, + /* 2360 */ 393, 394, 395, 396, 397, 398, 399, 357, 401, 449, + /* 2370 */ 449, 449, 362, 449, 364, 449, 449, 449, 449, 449, + /* 2380 */ 449, 320, 449, 449, 449, 449, 449, 449, 449, 449, + /* 2390 */ 449, 449, 449, 449, 449, 385, 449, 449, 449, 389, + /* 2400 */ 449, 320, 449, 393, 394, 395, 396, 397, 398, 399, + /* 2410 */ 349, 401, 449, 449, 449, 449, 449, 449, 357, 449, + /* 2420 */ 449, 449, 449, 362, 449, 364, 449, 449, 449, 449, + /* 2430 */ 349, 449, 449, 449, 449, 449, 449, 449, 357, 449, + /* 2440 */ 449, 449, 449, 362, 449, 364, 385, 449, 449, 449, + /* 2450 */ 389, 449, 320, 449, 393, 394, 395, 396, 397, 398, + /* 2460 */ 399, 449, 401, 449, 449, 449, 385, 449, 449, 449, + /* 2470 */ 389, 449, 449, 449, 393, 394, 395, 396, 397, 398, + /* 2480 */ 399, 349, 401, 449, 449, 449, 449, 449, 449, 357, + /* 2490 */ 449, 449, 449, 449, 362, 449, 364, 449, 449, 449, + /* 2500 */ 449, 449, 449, 449, 449, 320, 449, 449, 449, 449, + /* 2510 */ 449, 449, 449, 449, 449, 449, 449, 385, 449, 449, + /* 2520 */ 449, 389, 449, 449, 449, 393, 394, 395, 396, 397, + /* 2530 */ 398, 399, 449, 401, 349, 449, 449, 449, 449, 449, + /* 2540 */ 449, 449, 357, 449, 449, 449, 449, 362, 320, 364, + /* 2550 */ 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + /* 2560 */ 449, 449, 449, 449, 449, 449, 449, 449, 320, 449, + /* 2570 */ 385, 449, 449, 449, 389, 449, 449, 349, 393, 394, + /* 2580 */ 395, 396, 397, 398, 399, 357, 401, 449, 449, 449, + /* 2590 */ 362, 449, 364, 449, 449, 449, 449, 349, 449, 449, + /* 2600 */ 449, 449, 449, 449, 449, 357, 449, 449, 449, 449, + /* 2610 */ 362, 449, 364, 385, 449, 449, 449, 389, 449, 449, + /* 2620 */ 449, 393, 394, 395, 396, 397, 398, 399, 449, 401, + /* 2630 */ 449, 320, 449, 385, 449, 449, 449, 389, 449, 449, + /* 2640 */ 449, 393, 394, 395, 396, 397, 398, 399, 449, 401, + /* 2650 */ 320, 449, 449, 449, 449, 449, 449, 449, 449, 449, + /* 2660 */ 349, 449, 449, 449, 449, 449, 449, 449, 357, 449, + /* 2670 */ 449, 449, 449, 362, 449, 364, 449, 449, 449, 349, + /* 2680 */ 449, 449, 449, 449, 449, 449, 449, 357, 449, 449, + /* 2690 */ 449, 449, 362, 320, 364, 449, 385, 449, 449, 449, + /* 2700 */ 389, 449, 449, 449, 393, 394, 395, 396, 397, 398, + /* 2710 */ 399, 449, 401, 449, 449, 385, 449, 449, 449, 389, + /* 2720 */ 449, 449, 349, 393, 394, 395, 396, 397, 398, 399, + /* 2730 */ 357, 401, 449, 449, 449, 362, 449, 364, 449, 449, + /* 2740 */ 449, 449, 449, 449, 320, 449, 449, 449, 449, 449, + /* 2750 */ 449, 449, 449, 449, 449, 449, 449, 449, 385, 449, + /* 2760 */ 449, 449, 389, 449, 320, 449, 393, 394, 395, 396, + /* 2770 */ 397, 398, 399, 349, 401, 449, 449, 449, 449, 449, + /* 2780 */ 449, 357, 449, 449, 449, 449, 362, 449, 364, 449, + /* 2790 */ 449, 449, 449, 349, 449, 449, 449, 449, 449, 449, + /* 2800 */ 449, 357, 449, 449, 449, 449, 362, 449, 364, 385, + /* 2810 */ 449, 449, 449, 389, 449, 320, 449, 393, 394, 395, + /* 2820 */ 396, 397, 398, 399, 449, 401, 449, 449, 449, 385, + /* 2830 */ 449, 449, 449, 389, 449, 449, 449, 393, 394, 395, + /* 2840 */ 396, 397, 398, 399, 349, 401, 449, 449, 449, 449, + /* 2850 */ 449, 449, 357, 449, 449, 449, 449, 362, 449, 364, + /* 2860 */ 449, 449, 449, 449, 449, 449, 449, 449, 320, 449, + /* 2870 */ 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + /* 2880 */ 385, 449, 449, 449, 389, 449, 449, 449, 393, 394, + /* 2890 */ 395, 396, 397, 398, 399, 449, 401, 349, 449, 449, + /* 2900 */ 449, 449, 449, 449, 449, 357, 449, 449, 449, 449, + /* 2910 */ 362, 320, 364, 449, 449, 449, 449, 449, 449, 449, + /* 2920 */ 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + /* 2930 */ 449, 449, 449, 385, 449, 449, 449, 389, 449, 449, + /* 2940 */ 349, 393, 394, 395, 396, 397, 398, 399, 357, 401, + /* 2950 */ 449, 449, 449, 362, 449, 364, 449, 449, 449, 449, + /* 2960 */ 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, + /* 2970 */ 449, 449, 449, 449, 449, 449, 385, 449, 449, 449, + /* 2980 */ 389, 449, 449, 449, 393, 394, 395, 396, 397, 398, + /* 2990 */ 399, 449, 401, }; -#define YY_SHIFT_COUNT (688) +#define YY_SHIFT_COUNT (692) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2011) +#define YY_SHIFT_MAX (2051) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 1137, 0, 57, 268, 57, 325, 325, 325, 536, 325, - /* 10 */ 325, 325, 325, 325, 593, 804, 804, 861, 804, 804, - /* 20 */ 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, - /* 30 */ 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, - /* 40 */ 804, 804, 804, 804, 804, 804, 132, 214, 35, 62, - /* 50 */ 83, 142, 258, 142, 35, 35, 1528, 1528, 142, 1528, - /* 60 */ 1528, 131, 142, 203, 203, 30, 30, 23, 203, 203, - /* 70 */ 203, 203, 203, 203, 203, 203, 203, 203, 265, 203, - /* 80 */ 203, 203, 344, 203, 203, 380, 203, 203, 380, 395, - /* 90 */ 203, 380, 380, 380, 203, 389, 1066, 1220, 1220, 285, - /* 100 */ 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - /* 110 */ 797, 797, 797, 797, 797, 797, 797, 797, 797, 460, - /* 120 */ 886, 26, 23, 236, 236, 573, 38, 648, 107, 107, - /* 130 */ 567, 567, 567, 38, 433, 433, 419, 344, 1, 1, - /* 140 */ 365, 380, 380, 544, 544, 419, 551, 398, 398, 398, - /* 150 */ 398, 398, 398, 398, 1601, 137, 570, 770, 971, 42, - /* 160 */ 67, 37, 94, 479, 372, 798, 738, 875, 727, 817, - /* 170 */ 635, 727, 897, 857, 891, 1010, 1206, 1083, 1214, 1239, - /* 180 */ 1239, 1214, 1105, 1105, 1176, 1239, 1239, 1239, 1264, 1264, - /* 190 */ 1277, 265, 344, 265, 1283, 1288, 265, 1283, 265, 265, - /* 200 */ 265, 1239, 265, 1264, 380, 380, 380, 380, 380, 380, - /* 210 */ 380, 380, 380, 380, 380, 1239, 1264, 544, 1152, 1277, - /* 220 */ 389, 1173, 344, 389, 1239, 1239, 1283, 389, 1123, 544, - /* 230 */ 544, 544, 544, 1123, 544, 1212, 389, 419, 389, 433, - /* 240 */ 1380, 1380, 544, 1159, 1123, 544, 544, 1159, 1123, 544, - /* 250 */ 544, 380, 1164, 1252, 1159, 1165, 1168, 1181, 1010, 1157, - /* 260 */ 1166, 1170, 1190, 433, 1411, 1345, 1348, 544, 551, 1239, - /* 270 */ 389, 1437, 1264, 3046, 3046, 3046, 3046, 3046, 3046, 3046, - /* 280 */ 1063, 191, 402, 1312, 682, 752, 1094, 50, 838, 1149, - /* 290 */ 126, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, - /* 300 */ 470, 215, 11, 11, 264, 278, 164, 471, 170, 611, - /* 310 */ 366, 16, 459, 70, 16, 16, 16, 473, 915, 528, - /* 320 */ 888, 889, 957, 989, 959, 1099, 1100, 568, 839, 664, - /* 330 */ 952, 1009, 1073, 1075, 1077, 1081, 903, 832, 1003, 1087, - /* 340 */ 1082, 941, 1059, 892, 1088, 826, 1133, 1130, 1147, 1154, - /* 350 */ 1177, 1196, 1197, 1007, 1156, 1211, 1132, 1247, 1489, 1493, - /* 360 */ 1311, 1495, 1496, 1455, 1498, 1464, 1306, 1466, 1467, 1468, - /* 370 */ 1310, 1505, 1471, 1472, 1314, 1509, 1316, 1512, 1478, 1516, - /* 380 */ 1504, 1517, 1483, 1350, 1353, 1530, 1531, 1361, 1364, 1537, - /* 390 */ 1542, 1499, 1546, 1547, 1548, 1502, 1549, 1552, 1553, 1400, - /* 400 */ 1555, 1557, 1559, 1560, 1562, 1415, 1532, 1566, 1419, 1569, - /* 410 */ 1570, 1571, 1572, 1574, 1575, 1576, 1577, 1581, 1582, 1585, - /* 420 */ 1586, 1597, 1598, 1561, 1599, 1604, 1608, 1616, 1618, 1619, - /* 430 */ 1600, 1621, 1625, 1626, 1627, 1602, 1630, 1579, 1632, 1583, - /* 440 */ 1633, 1640, 1603, 1607, 1606, 1628, 1605, 1629, 1614, 1641, - /* 450 */ 1610, 1613, 1647, 1658, 1661, 1623, 1497, 1665, 1666, 1674, - /* 460 */ 1615, 1676, 1678, 1644, 1634, 1645, 1680, 1648, 1638, 1649, - /* 470 */ 1689, 1655, 1646, 1652, 1692, 1660, 1651, 1662, 1699, 1700, - /* 480 */ 1702, 1703, 1609, 1617, 1670, 1685, 1708, 1675, 1679, 1668, - /* 490 */ 1672, 1681, 1682, 1687, 1713, 1698, 1719, 1701, 1673, 1721, - /* 500 */ 1704, 1696, 1724, 1714, 1727, 1715, 1732, 1712, 1716, 1642, - /* 510 */ 1654, 1735, 1588, 1717, 1739, 1578, 1731, 1591, 1596, 1758, - /* 520 */ 1759, 1622, 1624, 1757, 1762, 1764, 1766, 1686, 1691, 1733, - /* 530 */ 1594, 1767, 1693, 1635, 1694, 1790, 1752, 1636, 1706, 1690, - /* 540 */ 1747, 1755, 1580, 1584, 1589, 1761, 1558, 1707, 1710, 1720, - /* 550 */ 1711, 1718, 1722, 1765, 1723, 1725, 1728, 1729, 1726, 1768, - /* 560 */ 1769, 1771, 1741, 1782, 1563, 1742, 1743, 1823, 1784, 1611, - /* 570 */ 1805, 1806, 1807, 1808, 1809, 1810, 1751, 1753, 1803, 1620, - /* 580 */ 1813, 1804, 1814, 1849, 1835, 1653, 1770, 1772, 1774, 1775, - /* 590 */ 1777, 1778, 1815, 1780, 1783, 1816, 1781, 1837, 1663, 1788, - /* 600 */ 1773, 1795, 1834, 1858, 1800, 1801, 1860, 1812, 1817, 1864, - /* 610 */ 1819, 1820, 1866, 1822, 1824, 1869, 1826, 1754, 1791, 1792, - /* 620 */ 1793, 1844, 1796, 1827, 1828, 1873, 1829, 1874, 1874, 1896, - /* 630 */ 1862, 1865, 1890, 1892, 1894, 1895, 1898, 1900, 1910, 1911, - /* 640 */ 1912, 1913, 1881, 1843, 1907, 1917, 1918, 1932, 1920, 1935, - /* 650 */ 1924, 1926, 1927, 1897, 1668, 1928, 1672, 1929, 1931, 1934, - /* 660 */ 1936, 1945, 1937, 1970, 1939, 1930, 1941, 1976, 1943, 1938, - /* 670 */ 1947, 1981, 1949, 1951, 1955, 1982, 1964, 1954, 1963, 2003, - /* 680 */ 1978, 1979, 2011, 1995, 1994, 1996, 1997, 1999, 2001, + /* 0 */ 1139, 0, 57, 269, 57, 326, 326, 326, 538, 326, + /* 10 */ 326, 326, 326, 326, 595, 807, 807, 864, 807, 807, + /* 20 */ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, + /* 30 */ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, + /* 40 */ 807, 807, 807, 807, 807, 807, 12, 14, 90, 62, + /* 50 */ 83, 80, 258, 80, 90, 90, 1499, 1499, 80, 1499, + /* 60 */ 1499, 87, 80, 113, 113, 53, 53, 23, 113, 113, + /* 70 */ 113, 113, 113, 113, 113, 113, 113, 113, 43, 113, + /* 80 */ 113, 113, 208, 113, 113, 288, 113, 113, 288, 306, + /* 90 */ 113, 288, 288, 288, 113, 142, 1070, 1243, 1243, 285, + /* 100 */ 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + /* 110 */ 800, 800, 800, 800, 800, 800, 800, 800, 800, 195, + /* 120 */ 1223, 26, 23, 340, 340, 54, 381, 182, 336, 336, + /* 130 */ 442, 442, 442, 381, 448, 448, 448, 462, 208, 1, + /* 140 */ 1, 409, 288, 288, 437, 437, 462, 597, 399, 399, + /* 150 */ 399, 399, 399, 399, 399, 1391, 137, 572, 774, 791, + /* 160 */ 201, 67, 171, 220, 351, 130, 677, 828, 761, 664, + /* 170 */ 758, 777, 664, 944, 847, 891, 928, 1143, 1025, 1158, + /* 180 */ 1158, 1208, 1208, 1158, 1080, 1080, 1162, 1208, 1208, 1208, + /* 190 */ 1241, 1241, 1246, 43, 208, 43, 1253, 1256, 43, 1253, + /* 200 */ 43, 43, 43, 1208, 43, 1241, 288, 288, 288, 288, + /* 210 */ 288, 288, 288, 288, 288, 288, 288, 1208, 1241, 437, + /* 220 */ 1135, 1246, 142, 1163, 208, 142, 1208, 1208, 1253, 142, + /* 230 */ 1107, 437, 437, 437, 437, 1107, 437, 1199, 142, 462, + /* 240 */ 142, 448, 1378, 1378, 437, 1156, 1107, 437, 437, 1156, + /* 250 */ 1107, 437, 437, 288, 1161, 1258, 1156, 1169, 1173, 1186, + /* 260 */ 928, 1170, 1175, 1180, 1200, 448, 1428, 1355, 1358, 437, + /* 270 */ 597, 1208, 142, 1426, 1241, 2993, 2993, 2993, 2993, 2993, + /* 280 */ 2993, 2993, 1066, 191, 403, 1785, 754, 684, 1098, 50, + /* 290 */ 845, 1038, 471, 1047, 1047, 1047, 1047, 1047, 1047, 1047, + /* 300 */ 1047, 1047, 603, 123, 11, 11, 157, 101, 542, 79, + /* 310 */ 362, 427, 211, 59, 589, 265, 59, 59, 59, 941, + /* 320 */ 1002, 369, 884, 890, 892, 898, 905, 975, 1009, 1096, + /* 330 */ 586, 841, 949, 998, 1014, 1065, 1072, 1073, 1077, 902, + /* 340 */ 785, 991, 1090, 1079, 527, 1004, 987, 1084, 433, 1137, + /* 350 */ 1091, 1141, 1142, 1146, 1148, 1151, 1000, 1088, 1089, 802, + /* 360 */ 1125, 1488, 1489, 1308, 1504, 1505, 1468, 1515, 1481, 1324, + /* 370 */ 1484, 1487, 1490, 1329, 1524, 1491, 1492, 1334, 1530, 1337, + /* 380 */ 1535, 1501, 1547, 1526, 1549, 1509, 1373, 1382, 1560, 1562, + /* 390 */ 1392, 1394, 1563, 1566, 1523, 1568, 1572, 1574, 1533, 1576, + /* 400 */ 1577, 1578, 1537, 1580, 1581, 1583, 1584, 1585, 1587, 1439, + /* 410 */ 1554, 1597, 1451, 1601, 1602, 1606, 1608, 1611, 1616, 1617, + /* 420 */ 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1586, 1625, 1626, + /* 430 */ 1627, 1629, 1630, 1631, 1582, 1632, 1633, 1634, 1636, 1603, + /* 440 */ 1637, 1596, 1640, 1598, 1641, 1653, 1614, 1628, 1638, 1645, + /* 450 */ 1615, 1646, 1639, 1668, 1643, 1635, 1669, 1670, 1671, 1654, + /* 460 */ 1497, 1665, 1672, 1673, 1642, 1676, 1679, 1649, 1650, 1657, + /* 470 */ 1680, 1663, 1655, 1681, 1707, 1674, 1677, 1682, 1711, 1688, + /* 480 */ 1678, 1687, 1712, 1727, 1728, 1729, 1651, 1652, 1695, 1710, + /* 490 */ 1733, 1699, 1701, 1694, 1709, 1703, 1715, 1734, 1755, 1735, + /* 500 */ 1758, 1738, 1713, 1761, 1741, 1730, 1767, 1737, 1768, 1739, + /* 510 */ 1769, 1748, 1751, 1683, 1685, 1773, 1612, 1742, 1776, 1607, + /* 520 */ 1759, 1644, 1648, 1780, 1782, 1656, 1658, 1787, 1783, 1788, + /* 530 */ 1792, 1691, 1698, 1770, 1662, 1794, 1708, 1659, 1716, 1806, + /* 540 */ 1772, 1666, 1720, 1705, 1766, 1774, 1591, 1590, 1600, 1779, + /* 550 */ 1588, 1740, 1732, 1743, 1744, 1745, 1749, 1786, 1750, 1752, + /* 560 */ 1757, 1760, 1771, 1795, 1784, 1789, 1762, 1801, 1610, 1775, + /* 570 */ 1778, 1828, 1809, 1660, 1832, 1833, 1834, 1839, 1840, 1845, + /* 580 */ 1790, 1793, 1836, 1661, 1844, 1837, 1843, 1888, 1869, 1692, + /* 590 */ 1800, 1802, 1804, 1807, 1805, 1808, 1849, 1810, 1815, 1850, + /* 600 */ 1817, 1891, 1723, 1816, 1821, 1819, 1887, 1892, 1838, 1835, + /* 610 */ 1893, 1841, 1851, 1896, 1842, 1853, 1899, 1855, 1856, 1909, + /* 620 */ 1858, 1846, 1847, 1852, 1854, 1928, 1848, 1861, 1862, 1922, + /* 630 */ 1864, 1916, 1916, 1938, 1900, 1902, 1934, 1936, 1939, 1940, + /* 640 */ 1941, 1942, 1943, 1944, 1945, 1946, 1905, 1894, 1947, 1951, + /* 650 */ 1952, 1960, 1953, 1961, 1956, 1957, 1959, 1927, 1694, 1971, + /* 660 */ 1709, 1972, 1973, 1975, 1977, 1992, 1980, 2016, 1982, 1976, + /* 670 */ 1979, 2019, 1985, 1978, 1983, 2024, 1994, 1984, 1988, 2030, + /* 680 */ 1998, 1987, 1996, 2037, 2012, 2015, 2051, 2032, 2031, 2033, + /* 690 */ 2042, 2045, 2048, }; -#define YY_REDUCE_COUNT (279) -#define YY_REDUCE_MIN (-350) -#define YY_REDUCE_MAX (2645) +#define YY_REDUCE_COUNT (281) +#define YY_REDUCE_MIN (-379) +#define YY_REDUCE_MAX (2591) static const short yy_reduce_ofst[] = { - /* 0 */ 179, -252, -312, 882, 13, 281, 549, 992, 262, 1074, - /* 10 */ 1127, 1195, 1217, 1275, 1377, 530, 1436, 1491, 1544, 1595, - /* 20 */ 1612, 1697, 1748, 1811, 1831, 1882, 1899, 1942, 1993, 2010, - /* 30 */ 2061, 2112, 2131, 2194, 2216, 2276, 2296, 2339, 2359, 2410, - /* 40 */ 2461, 2480, 2543, 2565, 2625, 2645, 21, 279, -222, 198, - /* 50 */ 442, 465, 607, 924, -97, -28, -350, -347, -315, -340, - /* 60 */ -61, -63, -26, 39, 96, -321, -317, -344, -311, 7, - /* 70 */ 238, 275, 312, 376, 379, 435, 436, 506, -230, 532, - /* 80 */ 543, 550, -189, 592, 640, 213, 645, 701, -245, -199, - /* 90 */ 704, 323, 102, 432, 758, -102, 56, -226, -226, -89, - /* 100 */ -228, -181, 292, 370, 409, 462, 469, 502, 508, 515, - /* 110 */ 529, 548, 597, 617, 633, 666, 669, 680, 687, 233, - /* 120 */ 17, -243, -265, -270, -125, 169, -49, -179, -36, 90, - /* 130 */ -243, 49, 185, 274, 371, 464, 341, 347, 130, 339, - /* 140 */ 384, 377, 474, 368, 467, 560, 519, -332, 321, 424, - /* 150 */ 487, 583, 644, 702, 520, 399, 714, 677, 775, 719, - /* 160 */ 828, 737, 834, 834, 864, 867, 866, 807, 821, 821, - /* 170 */ 805, 821, 835, 827, 834, 865, 869, 877, 890, 933, - /* 180 */ 934, 894, 899, 901, 938, 946, 956, 963, 965, 975, - /* 190 */ 916, 968, 939, 970, 929, 932, 982, 940, 983, 987, - /* 200 */ 988, 993, 990, 1001, 976, 977, 978, 980, 981, 991, - /* 210 */ 994, 995, 996, 999, 1002, 1011, 1016, 997, 966, 969, - /* 220 */ 1023, 979, 1006, 1027, 1030, 1037, 998, 1036, 1000, 1013, - /* 230 */ 1014, 1018, 1020, 1012, 1021, 1022, 1065, 1051, 1067, 1042, - /* 240 */ 1015, 1019, 1040, 974, 1038, 1050, 1053, 984, 1044, 1055, - /* 250 */ 1056, 834, 1005, 1004, 1017, 1032, 1034, 1008, 1039, 985, - /* 260 */ 986, 1024, 821, 1084, 1048, 1031, 1091, 1102, 1106, 1134, - /* 270 */ 1136, 1155, 1161, 1097, 1104, 1138, 1142, 1145, 1162, 1174, + /* 0 */ 400, -253, -313, 885, 13, 282, 551, 996, 263, 1101, + /* 10 */ 1144, 1197, 1250, 1293, 1346, 532, 1402, 1464, 1522, 1544, + /* 20 */ 1604, 1647, 1664, 1718, 1736, 1798, 1822, 1865, 1885, 1948, + /* 30 */ 1967, 2010, 2061, 2081, 2132, 2185, 2228, 2248, 2311, 2330, + /* 40 */ 2373, 2424, 2444, 2495, 2548, 2591, 21, 280, -223, 801, + /* 50 */ 924, 926, 933, 984, -98, -28, -351, -348, -316, -341, + /* 60 */ -20, 131, 475, 27, 36, -322, -318, -345, -312, 225, + /* 70 */ 236, 238, 261, 276, 283, 286, 313, 436, -231, 493, + /* 80 */ 508, 550, -245, 552, 555, -51, 565, 613, -22, -200, + /* 90 */ 615, 64, 30, 109, 380, 28, -311, -379, -379, -65, + /* 100 */ -137, -27, -15, 197, 248, 259, 293, 304, 329, 353, + /* 110 */ 416, 464, 472, 504, 505, 510, 526, 544, 619, -62, + /* 120 */ -102, 133, -165, 170, 244, 111, 165, 320, 230, 305, + /* 130 */ 133, 228, 491, 221, -12, 417, 534, 430, 467, 312, + /* 140 */ 512, 547, -211, 273, 606, 612, 637, 623, 390, 415, + /* 150 */ 482, 495, 585, 611, 627, 588, 722, 666, 651, 765, + /* 160 */ 663, 776, 696, 779, 779, 829, 832, 803, 769, 744, + /* 170 */ 744, 726, 744, 755, 746, 779, 794, 806, 809, 833, + /* 180 */ 835, 901, 904, 861, 868, 881, 916, 932, 934, 935, + /* 190 */ 942, 943, 886, 936, 903, 940, 899, 907, 945, 914, + /* 200 */ 963, 964, 967, 972, 970, 992, 966, 968, 973, 974, + /* 210 */ 976, 977, 979, 981, 982, 990, 993, 985, 997, 959, + /* 220 */ 956, 950, 1011, 961, 986, 1018, 1023, 1024, 978, 1027, + /* 230 */ 994, 1012, 1013, 1017, 1020, 1001, 1021, 1016, 1054, 1042, + /* 240 */ 1058, 1039, 1007, 1008, 1041, 983, 1034, 1049, 1051, 988, + /* 250 */ 1043, 1052, 1057, 779, 999, 989, 1003, 1005, 1010, 1015, + /* 260 */ 1048, 1006, 1019, 1026, 744, 1085, 1060, 1044, 1100, 1094, + /* 270 */ 1118, 1131, 1130, 1145, 1147, 1086, 1095, 1140, 1149, 1160, + /* 280 */ 1154, 1164, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 10 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 20 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 30 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 40 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 50 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 60 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 70 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1610, 1536, - /* 80 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 90 */ 1536, 1536, 1536, 1536, 1536, 1608, 1775, 1962, 1536, 1536, - /* 100 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 110 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 120 */ 1536, 1974, 1536, 1536, 1536, 1610, 1536, 1608, 1934, 1934, - /* 130 */ 1974, 1974, 1974, 1536, 1536, 1536, 1715, 1536, 1816, 1816, - /* 140 */ 1536, 1536, 1536, 1536, 1536, 1715, 1536, 1536, 1536, 1536, - /* 150 */ 1536, 1536, 1536, 1536, 1810, 1536, 1999, 2052, 1536, 1536, - /* 160 */ 1536, 2002, 1536, 1536, 1536, 1536, 1668, 1989, 1966, 1980, - /* 170 */ 2036, 1967, 1964, 1983, 1536, 1993, 1536, 1803, 1780, 1536, - /* 180 */ 1536, 1780, 1777, 1777, 1659, 1536, 1536, 1536, 1536, 1536, - /* 190 */ 1536, 1610, 1536, 1610, 1536, 1536, 1610, 1536, 1610, 1610, - /* 200 */ 1610, 1536, 1610, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 210 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1822, 1536, - /* 220 */ 1608, 1812, 1536, 1608, 1536, 1536, 1536, 1608, 2007, 1536, - /* 230 */ 1536, 1536, 1536, 2007, 1536, 1536, 1608, 1536, 1608, 1536, - /* 240 */ 1536, 1536, 1536, 2009, 2007, 1536, 1536, 2009, 2007, 1536, - /* 250 */ 1536, 1536, 2021, 2017, 2009, 2025, 2023, 1995, 1993, 2055, - /* 260 */ 2042, 2038, 1980, 1536, 1536, 1536, 1684, 1536, 1536, 1536, - /* 270 */ 1608, 1568, 1536, 1805, 1816, 1718, 1718, 1718, 1611, 1541, - /* 280 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 290 */ 1536, 1891, 1536, 2020, 2019, 1938, 1937, 1936, 1927, 1890, - /* 300 */ 1536, 1680, 1889, 1888, 1536, 1536, 1536, 1536, 1536, 1536, - /* 310 */ 1536, 1882, 1536, 1536, 1883, 1881, 1880, 1536, 1536, 1536, - /* 320 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 330 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 2039, 2043, 1963, - /* 340 */ 1536, 1536, 1536, 1536, 1536, 1873, 1864, 1536, 1536, 1536, - /* 350 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 360 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 370 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 380 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 390 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 400 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 410 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 420 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 430 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 440 */ 1536, 1536, 1536, 1536, 1573, 1536, 1536, 1536, 1536, 1536, - /* 450 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 460 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 470 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 480 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1649, - /* 490 */ 1648, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 500 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1872, - /* 510 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 520 */ 1536, 1536, 1536, 2035, 1536, 1536, 1536, 1536, 1536, 1536, - /* 530 */ 1536, 1820, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 540 */ 1536, 1924, 1536, 1536, 1536, 1996, 1536, 1536, 1536, 1536, - /* 550 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 560 */ 1536, 1864, 1536, 2018, 1536, 1536, 2033, 1536, 2037, 1536, - /* 570 */ 1536, 1536, 1536, 1536, 1536, 1536, 1973, 1969, 1536, 1536, - /* 580 */ 1965, 1863, 1536, 1958, 1536, 1536, 1909, 1536, 1536, 1536, - /* 590 */ 1536, 1536, 1536, 1536, 1536, 1536, 1872, 1536, 1876, 1536, - /* 600 */ 1536, 1536, 1536, 1536, 1712, 1536, 1536, 1536, 1536, 1536, - /* 610 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1697, 1695, 1694, - /* 620 */ 1693, 1536, 1690, 1536, 1536, 1536, 1536, 1721, 1720, 1536, - /* 630 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 640 */ 1536, 1536, 1536, 1536, 1630, 1536, 1536, 1536, 1536, 1536, - /* 650 */ 1536, 1536, 1536, 1536, 1621, 1536, 1620, 1536, 1536, 1536, - /* 660 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 670 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - /* 680 */ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, + /* 0 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 10 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 20 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 30 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 40 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 50 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 60 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 70 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1617, 1543, + /* 80 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 90 */ 1543, 1543, 1543, 1543, 1543, 1615, 1783, 1971, 1543, 1543, + /* 100 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 110 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 120 */ 1543, 1983, 1543, 1543, 1543, 1617, 1543, 1615, 1943, 1943, + /* 130 */ 1983, 1983, 1983, 1543, 1543, 1543, 1543, 1722, 1543, 1824, + /* 140 */ 1824, 1543, 1543, 1543, 1543, 1543, 1722, 1543, 1543, 1543, + /* 150 */ 1543, 1543, 1543, 1543, 1543, 1818, 1543, 2008, 2061, 1543, + /* 160 */ 1543, 1543, 2011, 1543, 1543, 1543, 1543, 1675, 1998, 1975, + /* 170 */ 1989, 2045, 1976, 1973, 1992, 1543, 2002, 1543, 1811, 1788, + /* 180 */ 1788, 1543, 1543, 1788, 1785, 1785, 1666, 1543, 1543, 1543, + /* 190 */ 1543, 1543, 1543, 1617, 1543, 1617, 1543, 1543, 1617, 1543, + /* 200 */ 1617, 1617, 1617, 1543, 1617, 1543, 1543, 1543, 1543, 1543, + /* 210 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 220 */ 1830, 1543, 1615, 1820, 1543, 1615, 1543, 1543, 1543, 1615, + /* 230 */ 2016, 1543, 1543, 1543, 1543, 2016, 1543, 1543, 1615, 1543, + /* 240 */ 1615, 1543, 1543, 1543, 1543, 2018, 2016, 1543, 1543, 2018, + /* 250 */ 2016, 1543, 1543, 1543, 2030, 2026, 2018, 2034, 2032, 2004, + /* 260 */ 2002, 2064, 2051, 2047, 1989, 1543, 1543, 1543, 1691, 1543, + /* 270 */ 1543, 1543, 1615, 1575, 1543, 1813, 1824, 1725, 1725, 1725, + /* 280 */ 1618, 1548, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 290 */ 1543, 1543, 1543, 1899, 1543, 2029, 2028, 1947, 1946, 1945, + /* 300 */ 1936, 1898, 1543, 1687, 1897, 1896, 1543, 1543, 1543, 1543, + /* 310 */ 1543, 1543, 1543, 1890, 1543, 1543, 1891, 1889, 1888, 1543, + /* 320 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 330 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 340 */ 2048, 2052, 1972, 1543, 1543, 1543, 1543, 1543, 1881, 1872, + /* 350 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 360 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 370 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 380 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 390 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 400 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 410 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 420 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 430 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 440 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1580, 1543, + /* 450 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 460 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 470 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 480 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 490 */ 1543, 1543, 1543, 1656, 1655, 1543, 1543, 1543, 1543, 1543, + /* 500 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 510 */ 1543, 1543, 1543, 1880, 1543, 1543, 1543, 1543, 1543, 1543, + /* 520 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 2044, 1543, 1543, + /* 530 */ 1543, 1543, 1543, 1543, 1543, 1828, 1543, 1543, 1543, 1543, + /* 540 */ 1543, 1543, 1543, 1543, 1543, 1933, 1543, 1543, 1543, 2005, + /* 550 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 560 */ 1543, 1543, 1543, 1543, 1543, 1872, 1543, 2027, 1543, 1543, + /* 570 */ 2042, 1543, 2046, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 580 */ 1982, 1978, 1543, 1543, 1974, 1871, 1543, 1967, 1543, 1543, + /* 590 */ 1918, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 600 */ 1880, 1543, 1884, 1543, 1543, 1543, 1543, 1543, 1719, 1543, + /* 610 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 620 */ 1543, 1704, 1702, 1701, 1700, 1543, 1697, 1543, 1543, 1543, + /* 630 */ 1543, 1728, 1727, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 640 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1637, 1543, + /* 650 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1628, 1543, + /* 660 */ 1627, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 670 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 680 */ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + /* 690 */ 1543, 1543, 1543, }; /********** End of lemon-generated parsing tables *****************************/ @@ -1239,6 +1232,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* WEND => nothing */ 0, /* WDURATION => nothing */ 0, /* IROWTS => nothing */ + 0, /* QTAGS => nothing */ 0, /* CAST => nothing */ 0, /* NOW => nothing */ 0, /* TODAY => nothing */ @@ -1250,7 +1244,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* COUNT => nothing */ 0, /* LAST_ROW => nothing */ 0, /* CASE => nothing */ - 264, /* END => ABORT */ + 265, /* END => ABORT */ 0, /* WHEN => nothing */ 0, /* THEN => nothing */ 0, /* ELSE => nothing */ @@ -1292,57 +1286,57 @@ static const YYCODETYPE yyFallback[] = { 0, /* ASC => nothing */ 0, /* NULLS => nothing */ 0, /* ABORT => nothing */ - 264, /* AFTER => ABORT */ - 264, /* ATTACH => ABORT */ - 264, /* BEFORE => ABORT */ - 264, /* BEGIN => ABORT */ - 264, /* BITAND => ABORT */ - 264, /* BITNOT => ABORT */ - 264, /* BITOR => ABORT */ - 264, /* BLOCKS => ABORT */ - 264, /* CHANGE => ABORT */ - 264, /* COMMA => ABORT */ - 264, /* COMPACT => ABORT */ - 264, /* CONCAT => ABORT */ - 264, /* CONFLICT => ABORT */ - 264, /* COPY => ABORT */ - 264, /* DEFERRED => ABORT */ - 264, /* DELIMITERS => ABORT */ - 264, /* DETACH => ABORT */ - 264, /* DIVIDE => ABORT */ - 264, /* DOT => ABORT */ - 264, /* EACH => ABORT */ - 264, /* FAIL => ABORT */ - 264, /* FILE => ABORT */ - 264, /* FOR => ABORT */ - 264, /* GLOB => ABORT */ - 264, /* ID => ABORT */ - 264, /* IMMEDIATE => ABORT */ - 264, /* IMPORT => ABORT */ - 264, /* INITIALLY => ABORT */ - 264, /* INSTEAD => ABORT */ - 264, /* ISNULL => ABORT */ - 264, /* KEY => ABORT */ - 264, /* NK_BITNOT => ABORT */ - 264, /* NK_SEMI => ABORT */ - 264, /* NOTNULL => ABORT */ - 264, /* OF => ABORT */ - 264, /* PLUS => ABORT */ - 264, /* PRIVILEGE => ABORT */ - 264, /* RAISE => ABORT */ - 264, /* REPLACE => ABORT */ - 264, /* RESTRICT => ABORT */ - 264, /* ROW => ABORT */ - 264, /* SEMI => ABORT */ - 264, /* STAR => ABORT */ - 264, /* STATEMENT => ABORT */ - 264, /* STRING => ABORT */ - 264, /* TIMES => ABORT */ - 264, /* UPDATE => ABORT */ - 264, /* VALUES => ABORT */ - 264, /* VARIABLE => ABORT */ - 264, /* VIEW => ABORT */ - 264, /* WAL => ABORT */ + 265, /* AFTER => ABORT */ + 265, /* ATTACH => ABORT */ + 265, /* BEFORE => ABORT */ + 265, /* BEGIN => ABORT */ + 265, /* BITAND => ABORT */ + 265, /* BITNOT => ABORT */ + 265, /* BITOR => ABORT */ + 265, /* BLOCKS => ABORT */ + 265, /* CHANGE => ABORT */ + 265, /* COMMA => ABORT */ + 265, /* COMPACT => ABORT */ + 265, /* CONCAT => ABORT */ + 265, /* CONFLICT => ABORT */ + 265, /* COPY => ABORT */ + 265, /* DEFERRED => ABORT */ + 265, /* DELIMITERS => ABORT */ + 265, /* DETACH => ABORT */ + 265, /* DIVIDE => ABORT */ + 265, /* DOT => ABORT */ + 265, /* EACH => ABORT */ + 265, /* FAIL => ABORT */ + 265, /* FILE => ABORT */ + 265, /* FOR => ABORT */ + 265, /* GLOB => ABORT */ + 265, /* ID => ABORT */ + 265, /* IMMEDIATE => ABORT */ + 265, /* IMPORT => ABORT */ + 265, /* INITIALLY => ABORT */ + 265, /* INSTEAD => ABORT */ + 265, /* ISNULL => ABORT */ + 265, /* KEY => ABORT */ + 265, /* NK_BITNOT => ABORT */ + 265, /* NK_SEMI => ABORT */ + 265, /* NOTNULL => ABORT */ + 265, /* OF => ABORT */ + 265, /* PLUS => ABORT */ + 265, /* PRIVILEGE => ABORT */ + 265, /* RAISE => ABORT */ + 265, /* REPLACE => ABORT */ + 265, /* RESTRICT => ABORT */ + 265, /* ROW => ABORT */ + 265, /* SEMI => ABORT */ + 265, /* STAR => ABORT */ + 265, /* STATEMENT => ABORT */ + 265, /* STRING => ABORT */ + 265, /* TIMES => ABORT */ + 265, /* UPDATE => ABORT */ + 265, /* VALUES => ABORT */ + 265, /* VARIABLE => ABORT */ + 265, /* VIEW => ABORT */ + 265, /* WAL => ABORT */ }; #endif /* YYFALLBACK */ @@ -1642,242 +1636,243 @@ static const char *const yyTokenName[] = { /* 209 */ "WEND", /* 210 */ "WDURATION", /* 211 */ "IROWTS", - /* 212 */ "CAST", - /* 213 */ "NOW", - /* 214 */ "TODAY", - /* 215 */ "TIMEZONE", - /* 216 */ "CLIENT_VERSION", - /* 217 */ "SERVER_VERSION", - /* 218 */ "SERVER_STATUS", - /* 219 */ "CURRENT_USER", - /* 220 */ "COUNT", - /* 221 */ "LAST_ROW", - /* 222 */ "CASE", - /* 223 */ "END", - /* 224 */ "WHEN", - /* 225 */ "THEN", - /* 226 */ "ELSE", - /* 227 */ "BETWEEN", - /* 228 */ "IS", - /* 229 */ "NK_LT", - /* 230 */ "NK_GT", - /* 231 */ "NK_LE", - /* 232 */ "NK_GE", - /* 233 */ "NK_NE", - /* 234 */ "MATCH", - /* 235 */ "NMATCH", - /* 236 */ "CONTAINS", - /* 237 */ "IN", - /* 238 */ "JOIN", - /* 239 */ "INNER", - /* 240 */ "SELECT", - /* 241 */ "DISTINCT", - /* 242 */ "WHERE", - /* 243 */ "PARTITION", - /* 244 */ "BY", - /* 245 */ "SESSION", - /* 246 */ "STATE_WINDOW", - /* 247 */ "SLIDING", - /* 248 */ "FILL", - /* 249 */ "VALUE", - /* 250 */ "NONE", - /* 251 */ "PREV", - /* 252 */ "LINEAR", - /* 253 */ "NEXT", - /* 254 */ "HAVING", - /* 255 */ "RANGE", - /* 256 */ "EVERY", - /* 257 */ "ORDER", - /* 258 */ "SLIMIT", - /* 259 */ "SOFFSET", - /* 260 */ "LIMIT", - /* 261 */ "OFFSET", - /* 262 */ "ASC", - /* 263 */ "NULLS", - /* 264 */ "ABORT", - /* 265 */ "AFTER", - /* 266 */ "ATTACH", - /* 267 */ "BEFORE", - /* 268 */ "BEGIN", - /* 269 */ "BITAND", - /* 270 */ "BITNOT", - /* 271 */ "BITOR", - /* 272 */ "BLOCKS", - /* 273 */ "CHANGE", - /* 274 */ "COMMA", - /* 275 */ "COMPACT", - /* 276 */ "CONCAT", - /* 277 */ "CONFLICT", - /* 278 */ "COPY", - /* 279 */ "DEFERRED", - /* 280 */ "DELIMITERS", - /* 281 */ "DETACH", - /* 282 */ "DIVIDE", - /* 283 */ "DOT", - /* 284 */ "EACH", - /* 285 */ "FAIL", - /* 286 */ "FILE", - /* 287 */ "FOR", - /* 288 */ "GLOB", - /* 289 */ "ID", - /* 290 */ "IMMEDIATE", - /* 291 */ "IMPORT", - /* 292 */ "INITIALLY", - /* 293 */ "INSTEAD", - /* 294 */ "ISNULL", - /* 295 */ "KEY", - /* 296 */ "NK_BITNOT", - /* 297 */ "NK_SEMI", - /* 298 */ "NOTNULL", - /* 299 */ "OF", - /* 300 */ "PLUS", - /* 301 */ "PRIVILEGE", - /* 302 */ "RAISE", - /* 303 */ "REPLACE", - /* 304 */ "RESTRICT", - /* 305 */ "ROW", - /* 306 */ "SEMI", - /* 307 */ "STAR", - /* 308 */ "STATEMENT", - /* 309 */ "STRING", - /* 310 */ "TIMES", - /* 311 */ "UPDATE", - /* 312 */ "VALUES", - /* 313 */ "VARIABLE", - /* 314 */ "VIEW", - /* 315 */ "WAL", - /* 316 */ "cmd", - /* 317 */ "account_options", - /* 318 */ "alter_account_options", - /* 319 */ "literal", - /* 320 */ "alter_account_option", - /* 321 */ "user_name", - /* 322 */ "sysinfo_opt", - /* 323 */ "privileges", - /* 324 */ "priv_level", - /* 325 */ "priv_type_list", - /* 326 */ "priv_type", - /* 327 */ "db_name", - /* 328 */ "dnode_endpoint", - /* 329 */ "not_exists_opt", - /* 330 */ "db_options", - /* 331 */ "exists_opt", - /* 332 */ "alter_db_options", - /* 333 */ "speed_opt", - /* 334 */ "integer_list", - /* 335 */ "variable_list", - /* 336 */ "retention_list", - /* 337 */ "alter_db_option", - /* 338 */ "retention", - /* 339 */ "full_table_name", - /* 340 */ "column_def_list", - /* 341 */ "tags_def_opt", - /* 342 */ "table_options", - /* 343 */ "multi_create_clause", - /* 344 */ "tags_def", - /* 345 */ "multi_drop_clause", - /* 346 */ "alter_table_clause", - /* 347 */ "alter_table_options", - /* 348 */ "column_name", - /* 349 */ "type_name", - /* 350 */ "signed_literal", - /* 351 */ "create_subtable_clause", - /* 352 */ "specific_cols_opt", - /* 353 */ "expression_list", - /* 354 */ "drop_table_clause", - /* 355 */ "col_name_list", - /* 356 */ "table_name", - /* 357 */ "column_def", - /* 358 */ "duration_list", - /* 359 */ "rollup_func_list", - /* 360 */ "alter_table_option", - /* 361 */ "duration_literal", - /* 362 */ "rollup_func_name", - /* 363 */ "function_name", - /* 364 */ "col_name", - /* 365 */ "db_name_cond_opt", - /* 366 */ "like_pattern_opt", - /* 367 */ "table_name_cond", - /* 368 */ "from_db_opt", - /* 369 */ "index_options", - /* 370 */ "func_list", - /* 371 */ "sliding_opt", - /* 372 */ "sma_stream_opt", - /* 373 */ "func", - /* 374 */ "stream_options", - /* 375 */ "topic_name", - /* 376 */ "query_or_subquery", - /* 377 */ "cgroup_name", - /* 378 */ "analyze_opt", - /* 379 */ "explain_options", - /* 380 */ "agg_func_opt", - /* 381 */ "bufsize_opt", - /* 382 */ "stream_name", - /* 383 */ "subtable_opt", - /* 384 */ "expression", - /* 385 */ "dnode_list", - /* 386 */ "where_clause_opt", - /* 387 */ "signed", - /* 388 */ "literal_func", - /* 389 */ "literal_list", - /* 390 */ "table_alias", - /* 391 */ "column_alias", - /* 392 */ "expr_or_subquery", - /* 393 */ "subquery", - /* 394 */ "pseudo_column", - /* 395 */ "column_reference", - /* 396 */ "function_expression", - /* 397 */ "case_when_expression", - /* 398 */ "star_func", - /* 399 */ "star_func_para_list", - /* 400 */ "noarg_func", - /* 401 */ "other_para_list", - /* 402 */ "star_func_para", - /* 403 */ "when_then_list", - /* 404 */ "case_when_else_opt", - /* 405 */ "common_expression", - /* 406 */ "when_then_expr", - /* 407 */ "predicate", - /* 408 */ "compare_op", - /* 409 */ "in_op", - /* 410 */ "in_predicate_value", - /* 411 */ "boolean_value_expression", - /* 412 */ "boolean_primary", - /* 413 */ "from_clause_opt", - /* 414 */ "table_reference_list", - /* 415 */ "table_reference", - /* 416 */ "table_primary", - /* 417 */ "joined_table", - /* 418 */ "alias_opt", - /* 419 */ "parenthesized_joined_table", - /* 420 */ "join_type", - /* 421 */ "search_condition", - /* 422 */ "query_specification", - /* 423 */ "set_quantifier_opt", - /* 424 */ "select_list", - /* 425 */ "partition_by_clause_opt", - /* 426 */ "range_opt", - /* 427 */ "every_opt", - /* 428 */ "fill_opt", - /* 429 */ "twindow_clause_opt", - /* 430 */ "group_by_clause_opt", - /* 431 */ "having_clause_opt", - /* 432 */ "select_item", - /* 433 */ "partition_list", - /* 434 */ "partition_item", - /* 435 */ "fill_mode", - /* 436 */ "group_by_list", - /* 437 */ "query_expression", - /* 438 */ "query_simple", - /* 439 */ "order_by_clause_opt", - /* 440 */ "slimit_clause_opt", - /* 441 */ "limit_clause_opt", - /* 442 */ "union_query_expression", - /* 443 */ "query_simple_or_subquery", - /* 444 */ "sort_specification_list", - /* 445 */ "sort_specification", - /* 446 */ "ordering_specification_opt", - /* 447 */ "null_ordering_opt", + /* 212 */ "QTAGS", + /* 213 */ "CAST", + /* 214 */ "NOW", + /* 215 */ "TODAY", + /* 216 */ "TIMEZONE", + /* 217 */ "CLIENT_VERSION", + /* 218 */ "SERVER_VERSION", + /* 219 */ "SERVER_STATUS", + /* 220 */ "CURRENT_USER", + /* 221 */ "COUNT", + /* 222 */ "LAST_ROW", + /* 223 */ "CASE", + /* 224 */ "END", + /* 225 */ "WHEN", + /* 226 */ "THEN", + /* 227 */ "ELSE", + /* 228 */ "BETWEEN", + /* 229 */ "IS", + /* 230 */ "NK_LT", + /* 231 */ "NK_GT", + /* 232 */ "NK_LE", + /* 233 */ "NK_GE", + /* 234 */ "NK_NE", + /* 235 */ "MATCH", + /* 236 */ "NMATCH", + /* 237 */ "CONTAINS", + /* 238 */ "IN", + /* 239 */ "JOIN", + /* 240 */ "INNER", + /* 241 */ "SELECT", + /* 242 */ "DISTINCT", + /* 243 */ "WHERE", + /* 244 */ "PARTITION", + /* 245 */ "BY", + /* 246 */ "SESSION", + /* 247 */ "STATE_WINDOW", + /* 248 */ "SLIDING", + /* 249 */ "FILL", + /* 250 */ "VALUE", + /* 251 */ "NONE", + /* 252 */ "PREV", + /* 253 */ "LINEAR", + /* 254 */ "NEXT", + /* 255 */ "HAVING", + /* 256 */ "RANGE", + /* 257 */ "EVERY", + /* 258 */ "ORDER", + /* 259 */ "SLIMIT", + /* 260 */ "SOFFSET", + /* 261 */ "LIMIT", + /* 262 */ "OFFSET", + /* 263 */ "ASC", + /* 264 */ "NULLS", + /* 265 */ "ABORT", + /* 266 */ "AFTER", + /* 267 */ "ATTACH", + /* 268 */ "BEFORE", + /* 269 */ "BEGIN", + /* 270 */ "BITAND", + /* 271 */ "BITNOT", + /* 272 */ "BITOR", + /* 273 */ "BLOCKS", + /* 274 */ "CHANGE", + /* 275 */ "COMMA", + /* 276 */ "COMPACT", + /* 277 */ "CONCAT", + /* 278 */ "CONFLICT", + /* 279 */ "COPY", + /* 280 */ "DEFERRED", + /* 281 */ "DELIMITERS", + /* 282 */ "DETACH", + /* 283 */ "DIVIDE", + /* 284 */ "DOT", + /* 285 */ "EACH", + /* 286 */ "FAIL", + /* 287 */ "FILE", + /* 288 */ "FOR", + /* 289 */ "GLOB", + /* 290 */ "ID", + /* 291 */ "IMMEDIATE", + /* 292 */ "IMPORT", + /* 293 */ "INITIALLY", + /* 294 */ "INSTEAD", + /* 295 */ "ISNULL", + /* 296 */ "KEY", + /* 297 */ "NK_BITNOT", + /* 298 */ "NK_SEMI", + /* 299 */ "NOTNULL", + /* 300 */ "OF", + /* 301 */ "PLUS", + /* 302 */ "PRIVILEGE", + /* 303 */ "RAISE", + /* 304 */ "REPLACE", + /* 305 */ "RESTRICT", + /* 306 */ "ROW", + /* 307 */ "SEMI", + /* 308 */ "STAR", + /* 309 */ "STATEMENT", + /* 310 */ "STRING", + /* 311 */ "TIMES", + /* 312 */ "UPDATE", + /* 313 */ "VALUES", + /* 314 */ "VARIABLE", + /* 315 */ "VIEW", + /* 316 */ "WAL", + /* 317 */ "cmd", + /* 318 */ "account_options", + /* 319 */ "alter_account_options", + /* 320 */ "literal", + /* 321 */ "alter_account_option", + /* 322 */ "user_name", + /* 323 */ "sysinfo_opt", + /* 324 */ "privileges", + /* 325 */ "priv_level", + /* 326 */ "priv_type_list", + /* 327 */ "priv_type", + /* 328 */ "db_name", + /* 329 */ "dnode_endpoint", + /* 330 */ "not_exists_opt", + /* 331 */ "db_options", + /* 332 */ "exists_opt", + /* 333 */ "alter_db_options", + /* 334 */ "speed_opt", + /* 335 */ "integer_list", + /* 336 */ "variable_list", + /* 337 */ "retention_list", + /* 338 */ "alter_db_option", + /* 339 */ "retention", + /* 340 */ "full_table_name", + /* 341 */ "column_def_list", + /* 342 */ "tags_def_opt", + /* 343 */ "table_options", + /* 344 */ "multi_create_clause", + /* 345 */ "tags_def", + /* 346 */ "multi_drop_clause", + /* 347 */ "alter_table_clause", + /* 348 */ "alter_table_options", + /* 349 */ "column_name", + /* 350 */ "type_name", + /* 351 */ "signed_literal", + /* 352 */ "create_subtable_clause", + /* 353 */ "specific_cols_opt", + /* 354 */ "expression_list", + /* 355 */ "drop_table_clause", + /* 356 */ "col_name_list", + /* 357 */ "table_name", + /* 358 */ "column_def", + /* 359 */ "duration_list", + /* 360 */ "rollup_func_list", + /* 361 */ "alter_table_option", + /* 362 */ "duration_literal", + /* 363 */ "rollup_func_name", + /* 364 */ "function_name", + /* 365 */ "col_name", + /* 366 */ "db_name_cond_opt", + /* 367 */ "like_pattern_opt", + /* 368 */ "table_name_cond", + /* 369 */ "from_db_opt", + /* 370 */ "index_options", + /* 371 */ "func_list", + /* 372 */ "sliding_opt", + /* 373 */ "sma_stream_opt", + /* 374 */ "func", + /* 375 */ "stream_options", + /* 376 */ "topic_name", + /* 377 */ "query_or_subquery", + /* 378 */ "cgroup_name", + /* 379 */ "analyze_opt", + /* 380 */ "explain_options", + /* 381 */ "agg_func_opt", + /* 382 */ "bufsize_opt", + /* 383 */ "stream_name", + /* 384 */ "subtable_opt", + /* 385 */ "expression", + /* 386 */ "dnode_list", + /* 387 */ "where_clause_opt", + /* 388 */ "signed", + /* 389 */ "literal_func", + /* 390 */ "literal_list", + /* 391 */ "table_alias", + /* 392 */ "column_alias", + /* 393 */ "expr_or_subquery", + /* 394 */ "subquery", + /* 395 */ "pseudo_column", + /* 396 */ "column_reference", + /* 397 */ "function_expression", + /* 398 */ "case_when_expression", + /* 399 */ "star_func", + /* 400 */ "star_func_para_list", + /* 401 */ "noarg_func", + /* 402 */ "other_para_list", + /* 403 */ "star_func_para", + /* 404 */ "when_then_list", + /* 405 */ "case_when_else_opt", + /* 406 */ "common_expression", + /* 407 */ "when_then_expr", + /* 408 */ "predicate", + /* 409 */ "compare_op", + /* 410 */ "in_op", + /* 411 */ "in_predicate_value", + /* 412 */ "boolean_value_expression", + /* 413 */ "boolean_primary", + /* 414 */ "from_clause_opt", + /* 415 */ "table_reference_list", + /* 416 */ "table_reference", + /* 417 */ "table_primary", + /* 418 */ "joined_table", + /* 419 */ "alias_opt", + /* 420 */ "parenthesized_joined_table", + /* 421 */ "join_type", + /* 422 */ "search_condition", + /* 423 */ "query_specification", + /* 424 */ "set_quantifier_opt", + /* 425 */ "select_list", + /* 426 */ "partition_by_clause_opt", + /* 427 */ "range_opt", + /* 428 */ "every_opt", + /* 429 */ "fill_opt", + /* 430 */ "twindow_clause_opt", + /* 431 */ "group_by_clause_opt", + /* 432 */ "having_clause_opt", + /* 433 */ "select_item", + /* 434 */ "partition_list", + /* 435 */ "partition_item", + /* 436 */ "fill_mode", + /* 437 */ "group_by_list", + /* 438 */ "query_expression", + /* 439 */ "query_simple", + /* 440 */ "order_by_clause_opt", + /* 441 */ "slimit_clause_opt", + /* 442 */ "limit_clause_opt", + /* 443 */ "union_query_expression", + /* 444 */ "query_simple_or_subquery", + /* 445 */ "sort_specification_list", + /* 446 */ "sort_specification", + /* 447 */ "ordering_specification_opt", + /* 448 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -2119,291 +2114,293 @@ static const char *const yyRuleName[] = { /* 231 */ "cmd ::= SHOW CONSUMERS", /* 232 */ "cmd ::= SHOW SUBSCRIPTIONS", /* 233 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt", - /* 234 */ "cmd ::= SHOW VNODES NK_INTEGER", - /* 235 */ "cmd ::= SHOW VNODES NK_STRING", - /* 236 */ "db_name_cond_opt ::=", - /* 237 */ "db_name_cond_opt ::= db_name NK_DOT", - /* 238 */ "like_pattern_opt ::=", - /* 239 */ "like_pattern_opt ::= LIKE NK_STRING", - /* 240 */ "table_name_cond ::= table_name", - /* 241 */ "from_db_opt ::=", - /* 242 */ "from_db_opt ::= FROM db_name", - /* 243 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options", - /* 244 */ "cmd ::= DROP INDEX exists_opt full_table_name", - /* 245 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", - /* 246 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt", - /* 247 */ "func_list ::= func", - /* 248 */ "func_list ::= func_list NK_COMMA func", - /* 249 */ "func ::= function_name NK_LP expression_list NK_RP", - /* 250 */ "sma_stream_opt ::=", - /* 251 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", - /* 252 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", - /* 253 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery", - /* 254 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", - /* 255 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", - /* 256 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", - /* 257 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", - /* 258 */ "cmd ::= DROP TOPIC exists_opt topic_name", - /* 259 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", - /* 260 */ "cmd ::= DESC full_table_name", - /* 261 */ "cmd ::= DESCRIBE full_table_name", - /* 262 */ "cmd ::= RESET QUERY CACHE", - /* 263 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery", - /* 264 */ "analyze_opt ::=", - /* 265 */ "analyze_opt ::= ANALYZE", - /* 266 */ "explain_options ::=", - /* 267 */ "explain_options ::= explain_options VERBOSE NK_BOOL", - /* 268 */ "explain_options ::= explain_options RATIO NK_FLOAT", - /* 269 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", - /* 270 */ "cmd ::= DROP FUNCTION exists_opt function_name", - /* 271 */ "agg_func_opt ::=", - /* 272 */ "agg_func_opt ::= AGGREGATE", - /* 273 */ "bufsize_opt ::=", - /* 274 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", - /* 275 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery", - /* 276 */ "cmd ::= DROP STREAM exists_opt stream_name", - /* 277 */ "stream_options ::=", - /* 278 */ "stream_options ::= stream_options TRIGGER AT_ONCE", - /* 279 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", - /* 280 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", - /* 281 */ "stream_options ::= stream_options WATERMARK duration_literal", - /* 282 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", - /* 283 */ "subtable_opt ::=", - /* 284 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP", - /* 285 */ "cmd ::= KILL CONNECTION NK_INTEGER", - /* 286 */ "cmd ::= KILL QUERY NK_STRING", - /* 287 */ "cmd ::= KILL TRANSACTION NK_INTEGER", - /* 288 */ "cmd ::= BALANCE VGROUP", - /* 289 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", - /* 290 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", - /* 291 */ "cmd ::= SPLIT VGROUP NK_INTEGER", - /* 292 */ "dnode_list ::= DNODE NK_INTEGER", - /* 293 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", - /* 294 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", - /* 295 */ "cmd ::= query_or_subquery", - /* 296 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery", - /* 297 */ "cmd ::= INSERT INTO full_table_name query_or_subquery", - /* 298 */ "literal ::= NK_INTEGER", - /* 299 */ "literal ::= NK_FLOAT", - /* 300 */ "literal ::= NK_STRING", - /* 301 */ "literal ::= NK_BOOL", - /* 302 */ "literal ::= TIMESTAMP NK_STRING", - /* 303 */ "literal ::= duration_literal", - /* 304 */ "literal ::= NULL", - /* 305 */ "literal ::= NK_QUESTION", - /* 306 */ "duration_literal ::= NK_VARIABLE", - /* 307 */ "signed ::= NK_INTEGER", - /* 308 */ "signed ::= NK_PLUS NK_INTEGER", - /* 309 */ "signed ::= NK_MINUS NK_INTEGER", - /* 310 */ "signed ::= NK_FLOAT", - /* 311 */ "signed ::= NK_PLUS NK_FLOAT", - /* 312 */ "signed ::= NK_MINUS NK_FLOAT", - /* 313 */ "signed_literal ::= signed", - /* 314 */ "signed_literal ::= NK_STRING", - /* 315 */ "signed_literal ::= NK_BOOL", - /* 316 */ "signed_literal ::= TIMESTAMP NK_STRING", - /* 317 */ "signed_literal ::= duration_literal", - /* 318 */ "signed_literal ::= NULL", - /* 319 */ "signed_literal ::= literal_func", - /* 320 */ "signed_literal ::= NK_QUESTION", - /* 321 */ "literal_list ::= signed_literal", - /* 322 */ "literal_list ::= literal_list NK_COMMA signed_literal", - /* 323 */ "db_name ::= NK_ID", - /* 324 */ "table_name ::= NK_ID", - /* 325 */ "column_name ::= NK_ID", - /* 326 */ "function_name ::= NK_ID", - /* 327 */ "table_alias ::= NK_ID", - /* 328 */ "column_alias ::= NK_ID", - /* 329 */ "user_name ::= NK_ID", - /* 330 */ "topic_name ::= NK_ID", - /* 331 */ "stream_name ::= NK_ID", - /* 332 */ "cgroup_name ::= NK_ID", - /* 333 */ "expr_or_subquery ::= expression", - /* 334 */ "expr_or_subquery ::= subquery", - /* 335 */ "expression ::= literal", - /* 336 */ "expression ::= pseudo_column", - /* 337 */ "expression ::= column_reference", - /* 338 */ "expression ::= function_expression", - /* 339 */ "expression ::= case_when_expression", - /* 340 */ "expression ::= NK_LP expression NK_RP", - /* 341 */ "expression ::= NK_PLUS expr_or_subquery", - /* 342 */ "expression ::= NK_MINUS expr_or_subquery", - /* 343 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery", - /* 344 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery", - /* 345 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery", - /* 346 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery", - /* 347 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery", - /* 348 */ "expression ::= column_reference NK_ARROW NK_STRING", - /* 349 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery", - /* 350 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery", - /* 351 */ "expression_list ::= expr_or_subquery", - /* 352 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery", - /* 353 */ "column_reference ::= column_name", - /* 354 */ "column_reference ::= table_name NK_DOT column_name", - /* 355 */ "pseudo_column ::= ROWTS", - /* 356 */ "pseudo_column ::= TBNAME", - /* 357 */ "pseudo_column ::= table_name NK_DOT TBNAME", - /* 358 */ "pseudo_column ::= QSTART", - /* 359 */ "pseudo_column ::= QEND", - /* 360 */ "pseudo_column ::= QDURATION", - /* 361 */ "pseudo_column ::= WSTART", - /* 362 */ "pseudo_column ::= WEND", - /* 363 */ "pseudo_column ::= WDURATION", - /* 364 */ "pseudo_column ::= IROWTS", - /* 365 */ "function_expression ::= function_name NK_LP expression_list NK_RP", - /* 366 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", - /* 367 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP", - /* 368 */ "function_expression ::= literal_func", - /* 369 */ "literal_func ::= noarg_func NK_LP NK_RP", - /* 370 */ "literal_func ::= NOW", - /* 371 */ "noarg_func ::= NOW", - /* 372 */ "noarg_func ::= TODAY", - /* 373 */ "noarg_func ::= TIMEZONE", - /* 374 */ "noarg_func ::= DATABASE", - /* 375 */ "noarg_func ::= CLIENT_VERSION", - /* 376 */ "noarg_func ::= SERVER_VERSION", - /* 377 */ "noarg_func ::= SERVER_STATUS", - /* 378 */ "noarg_func ::= CURRENT_USER", - /* 379 */ "noarg_func ::= USER", - /* 380 */ "star_func ::= COUNT", - /* 381 */ "star_func ::= FIRST", - /* 382 */ "star_func ::= LAST", - /* 383 */ "star_func ::= LAST_ROW", - /* 384 */ "star_func_para_list ::= NK_STAR", - /* 385 */ "star_func_para_list ::= other_para_list", - /* 386 */ "other_para_list ::= star_func_para", - /* 387 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", - /* 388 */ "star_func_para ::= expr_or_subquery", - /* 389 */ "star_func_para ::= table_name NK_DOT NK_STAR", - /* 390 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END", - /* 391 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END", - /* 392 */ "when_then_list ::= when_then_expr", - /* 393 */ "when_then_list ::= when_then_list when_then_expr", - /* 394 */ "when_then_expr ::= WHEN common_expression THEN common_expression", - /* 395 */ "case_when_else_opt ::=", - /* 396 */ "case_when_else_opt ::= ELSE common_expression", - /* 397 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery", - /* 398 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery", - /* 399 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery", - /* 400 */ "predicate ::= expr_or_subquery IS NULL", - /* 401 */ "predicate ::= expr_or_subquery IS NOT NULL", - /* 402 */ "predicate ::= expr_or_subquery in_op in_predicate_value", - /* 403 */ "compare_op ::= NK_LT", - /* 404 */ "compare_op ::= NK_GT", - /* 405 */ "compare_op ::= NK_LE", - /* 406 */ "compare_op ::= NK_GE", - /* 407 */ "compare_op ::= NK_NE", - /* 408 */ "compare_op ::= NK_EQ", - /* 409 */ "compare_op ::= LIKE", - /* 410 */ "compare_op ::= NOT LIKE", - /* 411 */ "compare_op ::= MATCH", - /* 412 */ "compare_op ::= NMATCH", - /* 413 */ "compare_op ::= CONTAINS", - /* 414 */ "in_op ::= IN", - /* 415 */ "in_op ::= NOT IN", - /* 416 */ "in_predicate_value ::= NK_LP literal_list NK_RP", - /* 417 */ "boolean_value_expression ::= boolean_primary", - /* 418 */ "boolean_value_expression ::= NOT boolean_primary", - /* 419 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 420 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 421 */ "boolean_primary ::= predicate", - /* 422 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 423 */ "common_expression ::= expr_or_subquery", - /* 424 */ "common_expression ::= boolean_value_expression", - /* 425 */ "from_clause_opt ::=", - /* 426 */ "from_clause_opt ::= FROM table_reference_list", - /* 427 */ "table_reference_list ::= table_reference", - /* 428 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 429 */ "table_reference ::= table_primary", - /* 430 */ "table_reference ::= joined_table", - /* 431 */ "table_primary ::= table_name alias_opt", - /* 432 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 433 */ "table_primary ::= subquery alias_opt", - /* 434 */ "table_primary ::= parenthesized_joined_table", - /* 435 */ "alias_opt ::=", - /* 436 */ "alias_opt ::= table_alias", - /* 437 */ "alias_opt ::= AS table_alias", - /* 438 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 439 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 440 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 441 */ "join_type ::=", - /* 442 */ "join_type ::= INNER", - /* 443 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt", - /* 444 */ "set_quantifier_opt ::=", - /* 445 */ "set_quantifier_opt ::= DISTINCT", - /* 446 */ "set_quantifier_opt ::= ALL", - /* 447 */ "select_list ::= select_item", - /* 448 */ "select_list ::= select_list NK_COMMA select_item", - /* 449 */ "select_item ::= NK_STAR", - /* 450 */ "select_item ::= common_expression", - /* 451 */ "select_item ::= common_expression column_alias", - /* 452 */ "select_item ::= common_expression AS column_alias", - /* 453 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 454 */ "where_clause_opt ::=", - /* 455 */ "where_clause_opt ::= WHERE search_condition", - /* 456 */ "partition_by_clause_opt ::=", - /* 457 */ "partition_by_clause_opt ::= PARTITION BY partition_list", - /* 458 */ "partition_list ::= partition_item", - /* 459 */ "partition_list ::= partition_list NK_COMMA partition_item", - /* 460 */ "partition_item ::= expr_or_subquery", - /* 461 */ "partition_item ::= expr_or_subquery column_alias", - /* 462 */ "partition_item ::= expr_or_subquery AS column_alias", - /* 463 */ "twindow_clause_opt ::=", - /* 464 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", - /* 465 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP", - /* 466 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 467 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 468 */ "sliding_opt ::=", - /* 469 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 470 */ "fill_opt ::=", - /* 471 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 472 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 473 */ "fill_mode ::= NONE", - /* 474 */ "fill_mode ::= PREV", - /* 475 */ "fill_mode ::= NULL", - /* 476 */ "fill_mode ::= LINEAR", - /* 477 */ "fill_mode ::= NEXT", - /* 478 */ "group_by_clause_opt ::=", - /* 479 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 480 */ "group_by_list ::= expr_or_subquery", - /* 481 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery", - /* 482 */ "having_clause_opt ::=", - /* 483 */ "having_clause_opt ::= HAVING search_condition", - /* 484 */ "range_opt ::=", - /* 485 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP", - /* 486 */ "every_opt ::=", - /* 487 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", - /* 488 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 489 */ "query_simple ::= query_specification", - /* 490 */ "query_simple ::= union_query_expression", - /* 491 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery", - /* 492 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery", - /* 493 */ "query_simple_or_subquery ::= query_simple", - /* 494 */ "query_simple_or_subquery ::= subquery", - /* 495 */ "query_or_subquery ::= query_expression", - /* 496 */ "query_or_subquery ::= subquery", - /* 497 */ "order_by_clause_opt ::=", - /* 498 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 499 */ "slimit_clause_opt ::=", - /* 500 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 501 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 502 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 503 */ "limit_clause_opt ::=", - /* 504 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 505 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 506 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 507 */ "subquery ::= NK_LP query_expression NK_RP", - /* 508 */ "subquery ::= NK_LP subquery NK_RP", - /* 509 */ "search_condition ::= common_expression", - /* 510 */ "sort_specification_list ::= sort_specification", - /* 511 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 512 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt", - /* 513 */ "ordering_specification_opt ::=", - /* 514 */ "ordering_specification_opt ::= ASC", - /* 515 */ "ordering_specification_opt ::= DESC", - /* 516 */ "null_ordering_opt ::=", - /* 517 */ "null_ordering_opt ::= NULLS FIRST", - /* 518 */ "null_ordering_opt ::= NULLS LAST", + /* 234 */ "cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt", + /* 235 */ "cmd ::= SHOW VNODES NK_INTEGER", + /* 236 */ "cmd ::= SHOW VNODES NK_STRING", + /* 237 */ "db_name_cond_opt ::=", + /* 238 */ "db_name_cond_opt ::= db_name NK_DOT", + /* 239 */ "like_pattern_opt ::=", + /* 240 */ "like_pattern_opt ::= LIKE NK_STRING", + /* 241 */ "table_name_cond ::= table_name", + /* 242 */ "from_db_opt ::=", + /* 243 */ "from_db_opt ::= FROM db_name", + /* 244 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options", + /* 245 */ "cmd ::= DROP INDEX exists_opt full_table_name", + /* 246 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt", + /* 247 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt", + /* 248 */ "func_list ::= func", + /* 249 */ "func_list ::= func_list NK_COMMA func", + /* 250 */ "func ::= function_name NK_LP expression_list NK_RP", + /* 251 */ "sma_stream_opt ::=", + /* 252 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal", + /* 253 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal", + /* 254 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery", + /* 255 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", + /* 256 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", + /* 257 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", + /* 258 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", + /* 259 */ "cmd ::= DROP TOPIC exists_opt topic_name", + /* 260 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", + /* 261 */ "cmd ::= DESC full_table_name", + /* 262 */ "cmd ::= DESCRIBE full_table_name", + /* 263 */ "cmd ::= RESET QUERY CACHE", + /* 264 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery", + /* 265 */ "analyze_opt ::=", + /* 266 */ "analyze_opt ::= ANALYZE", + /* 267 */ "explain_options ::=", + /* 268 */ "explain_options ::= explain_options VERBOSE NK_BOOL", + /* 269 */ "explain_options ::= explain_options RATIO NK_FLOAT", + /* 270 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt", + /* 271 */ "cmd ::= DROP FUNCTION exists_opt function_name", + /* 272 */ "agg_func_opt ::=", + /* 273 */ "agg_func_opt ::= AGGREGATE", + /* 274 */ "bufsize_opt ::=", + /* 275 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", + /* 276 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery", + /* 277 */ "cmd ::= DROP STREAM exists_opt stream_name", + /* 278 */ "stream_options ::=", + /* 279 */ "stream_options ::= stream_options TRIGGER AT_ONCE", + /* 280 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", + /* 281 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", + /* 282 */ "stream_options ::= stream_options WATERMARK duration_literal", + /* 283 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", + /* 284 */ "subtable_opt ::=", + /* 285 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP", + /* 286 */ "cmd ::= KILL CONNECTION NK_INTEGER", + /* 287 */ "cmd ::= KILL QUERY NK_STRING", + /* 288 */ "cmd ::= KILL TRANSACTION NK_INTEGER", + /* 289 */ "cmd ::= BALANCE VGROUP", + /* 290 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", + /* 291 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", + /* 292 */ "cmd ::= SPLIT VGROUP NK_INTEGER", + /* 293 */ "dnode_list ::= DNODE NK_INTEGER", + /* 294 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", + /* 295 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", + /* 296 */ "cmd ::= query_or_subquery", + /* 297 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery", + /* 298 */ "cmd ::= INSERT INTO full_table_name query_or_subquery", + /* 299 */ "literal ::= NK_INTEGER", + /* 300 */ "literal ::= NK_FLOAT", + /* 301 */ "literal ::= NK_STRING", + /* 302 */ "literal ::= NK_BOOL", + /* 303 */ "literal ::= TIMESTAMP NK_STRING", + /* 304 */ "literal ::= duration_literal", + /* 305 */ "literal ::= NULL", + /* 306 */ "literal ::= NK_QUESTION", + /* 307 */ "duration_literal ::= NK_VARIABLE", + /* 308 */ "signed ::= NK_INTEGER", + /* 309 */ "signed ::= NK_PLUS NK_INTEGER", + /* 310 */ "signed ::= NK_MINUS NK_INTEGER", + /* 311 */ "signed ::= NK_FLOAT", + /* 312 */ "signed ::= NK_PLUS NK_FLOAT", + /* 313 */ "signed ::= NK_MINUS NK_FLOAT", + /* 314 */ "signed_literal ::= signed", + /* 315 */ "signed_literal ::= NK_STRING", + /* 316 */ "signed_literal ::= NK_BOOL", + /* 317 */ "signed_literal ::= TIMESTAMP NK_STRING", + /* 318 */ "signed_literal ::= duration_literal", + /* 319 */ "signed_literal ::= NULL", + /* 320 */ "signed_literal ::= literal_func", + /* 321 */ "signed_literal ::= NK_QUESTION", + /* 322 */ "literal_list ::= signed_literal", + /* 323 */ "literal_list ::= literal_list NK_COMMA signed_literal", + /* 324 */ "db_name ::= NK_ID", + /* 325 */ "table_name ::= NK_ID", + /* 326 */ "column_name ::= NK_ID", + /* 327 */ "function_name ::= NK_ID", + /* 328 */ "table_alias ::= NK_ID", + /* 329 */ "column_alias ::= NK_ID", + /* 330 */ "user_name ::= NK_ID", + /* 331 */ "topic_name ::= NK_ID", + /* 332 */ "stream_name ::= NK_ID", + /* 333 */ "cgroup_name ::= NK_ID", + /* 334 */ "expr_or_subquery ::= expression", + /* 335 */ "expr_or_subquery ::= subquery", + /* 336 */ "expression ::= literal", + /* 337 */ "expression ::= pseudo_column", + /* 338 */ "expression ::= column_reference", + /* 339 */ "expression ::= function_expression", + /* 340 */ "expression ::= case_when_expression", + /* 341 */ "expression ::= NK_LP expression NK_RP", + /* 342 */ "expression ::= NK_PLUS expr_or_subquery", + /* 343 */ "expression ::= NK_MINUS expr_or_subquery", + /* 344 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery", + /* 345 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery", + /* 346 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery", + /* 347 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery", + /* 348 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery", + /* 349 */ "expression ::= column_reference NK_ARROW NK_STRING", + /* 350 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery", + /* 351 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery", + /* 352 */ "expression_list ::= expr_or_subquery", + /* 353 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery", + /* 354 */ "column_reference ::= column_name", + /* 355 */ "column_reference ::= table_name NK_DOT column_name", + /* 356 */ "pseudo_column ::= ROWTS", + /* 357 */ "pseudo_column ::= TBNAME", + /* 358 */ "pseudo_column ::= table_name NK_DOT TBNAME", + /* 359 */ "pseudo_column ::= QSTART", + /* 360 */ "pseudo_column ::= QEND", + /* 361 */ "pseudo_column ::= QDURATION", + /* 362 */ "pseudo_column ::= WSTART", + /* 363 */ "pseudo_column ::= WEND", + /* 364 */ "pseudo_column ::= WDURATION", + /* 365 */ "pseudo_column ::= IROWTS", + /* 366 */ "pseudo_column ::= QTAGS", + /* 367 */ "function_expression ::= function_name NK_LP expression_list NK_RP", + /* 368 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", + /* 369 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP", + /* 370 */ "function_expression ::= literal_func", + /* 371 */ "literal_func ::= noarg_func NK_LP NK_RP", + /* 372 */ "literal_func ::= NOW", + /* 373 */ "noarg_func ::= NOW", + /* 374 */ "noarg_func ::= TODAY", + /* 375 */ "noarg_func ::= TIMEZONE", + /* 376 */ "noarg_func ::= DATABASE", + /* 377 */ "noarg_func ::= CLIENT_VERSION", + /* 378 */ "noarg_func ::= SERVER_VERSION", + /* 379 */ "noarg_func ::= SERVER_STATUS", + /* 380 */ "noarg_func ::= CURRENT_USER", + /* 381 */ "noarg_func ::= USER", + /* 382 */ "star_func ::= COUNT", + /* 383 */ "star_func ::= FIRST", + /* 384 */ "star_func ::= LAST", + /* 385 */ "star_func ::= LAST_ROW", + /* 386 */ "star_func_para_list ::= NK_STAR", + /* 387 */ "star_func_para_list ::= other_para_list", + /* 388 */ "other_para_list ::= star_func_para", + /* 389 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", + /* 390 */ "star_func_para ::= expr_or_subquery", + /* 391 */ "star_func_para ::= table_name NK_DOT NK_STAR", + /* 392 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END", + /* 393 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END", + /* 394 */ "when_then_list ::= when_then_expr", + /* 395 */ "when_then_list ::= when_then_list when_then_expr", + /* 396 */ "when_then_expr ::= WHEN common_expression THEN common_expression", + /* 397 */ "case_when_else_opt ::=", + /* 398 */ "case_when_else_opt ::= ELSE common_expression", + /* 399 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery", + /* 400 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery", + /* 401 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery", + /* 402 */ "predicate ::= expr_or_subquery IS NULL", + /* 403 */ "predicate ::= expr_or_subquery IS NOT NULL", + /* 404 */ "predicate ::= expr_or_subquery in_op in_predicate_value", + /* 405 */ "compare_op ::= NK_LT", + /* 406 */ "compare_op ::= NK_GT", + /* 407 */ "compare_op ::= NK_LE", + /* 408 */ "compare_op ::= NK_GE", + /* 409 */ "compare_op ::= NK_NE", + /* 410 */ "compare_op ::= NK_EQ", + /* 411 */ "compare_op ::= LIKE", + /* 412 */ "compare_op ::= NOT LIKE", + /* 413 */ "compare_op ::= MATCH", + /* 414 */ "compare_op ::= NMATCH", + /* 415 */ "compare_op ::= CONTAINS", + /* 416 */ "in_op ::= IN", + /* 417 */ "in_op ::= NOT IN", + /* 418 */ "in_predicate_value ::= NK_LP literal_list NK_RP", + /* 419 */ "boolean_value_expression ::= boolean_primary", + /* 420 */ "boolean_value_expression ::= NOT boolean_primary", + /* 421 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 422 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 423 */ "boolean_primary ::= predicate", + /* 424 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 425 */ "common_expression ::= expr_or_subquery", + /* 426 */ "common_expression ::= boolean_value_expression", + /* 427 */ "from_clause_opt ::=", + /* 428 */ "from_clause_opt ::= FROM table_reference_list", + /* 429 */ "table_reference_list ::= table_reference", + /* 430 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 431 */ "table_reference ::= table_primary", + /* 432 */ "table_reference ::= joined_table", + /* 433 */ "table_primary ::= table_name alias_opt", + /* 434 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 435 */ "table_primary ::= subquery alias_opt", + /* 436 */ "table_primary ::= parenthesized_joined_table", + /* 437 */ "alias_opt ::=", + /* 438 */ "alias_opt ::= table_alias", + /* 439 */ "alias_opt ::= AS table_alias", + /* 440 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 441 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 442 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 443 */ "join_type ::=", + /* 444 */ "join_type ::= INNER", + /* 445 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt", + /* 446 */ "set_quantifier_opt ::=", + /* 447 */ "set_quantifier_opt ::= DISTINCT", + /* 448 */ "set_quantifier_opt ::= ALL", + /* 449 */ "select_list ::= select_item", + /* 450 */ "select_list ::= select_list NK_COMMA select_item", + /* 451 */ "select_item ::= NK_STAR", + /* 452 */ "select_item ::= common_expression", + /* 453 */ "select_item ::= common_expression column_alias", + /* 454 */ "select_item ::= common_expression AS column_alias", + /* 455 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 456 */ "where_clause_opt ::=", + /* 457 */ "where_clause_opt ::= WHERE search_condition", + /* 458 */ "partition_by_clause_opt ::=", + /* 459 */ "partition_by_clause_opt ::= PARTITION BY partition_list", + /* 460 */ "partition_list ::= partition_item", + /* 461 */ "partition_list ::= partition_list NK_COMMA partition_item", + /* 462 */ "partition_item ::= expr_or_subquery", + /* 463 */ "partition_item ::= expr_or_subquery column_alias", + /* 464 */ "partition_item ::= expr_or_subquery AS column_alias", + /* 465 */ "twindow_clause_opt ::=", + /* 466 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", + /* 467 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP", + /* 468 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 469 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 470 */ "sliding_opt ::=", + /* 471 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 472 */ "fill_opt ::=", + /* 473 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 474 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 475 */ "fill_mode ::= NONE", + /* 476 */ "fill_mode ::= PREV", + /* 477 */ "fill_mode ::= NULL", + /* 478 */ "fill_mode ::= LINEAR", + /* 479 */ "fill_mode ::= NEXT", + /* 480 */ "group_by_clause_opt ::=", + /* 481 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 482 */ "group_by_list ::= expr_or_subquery", + /* 483 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery", + /* 484 */ "having_clause_opt ::=", + /* 485 */ "having_clause_opt ::= HAVING search_condition", + /* 486 */ "range_opt ::=", + /* 487 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP", + /* 488 */ "every_opt ::=", + /* 489 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", + /* 490 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 491 */ "query_simple ::= query_specification", + /* 492 */ "query_simple ::= union_query_expression", + /* 493 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery", + /* 494 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery", + /* 495 */ "query_simple_or_subquery ::= query_simple", + /* 496 */ "query_simple_or_subquery ::= subquery", + /* 497 */ "query_or_subquery ::= query_expression", + /* 498 */ "query_or_subquery ::= subquery", + /* 499 */ "order_by_clause_opt ::=", + /* 500 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 501 */ "slimit_clause_opt ::=", + /* 502 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 503 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 504 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 505 */ "limit_clause_opt ::=", + /* 506 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 507 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 508 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 509 */ "subquery ::= NK_LP query_expression NK_RP", + /* 510 */ "subquery ::= NK_LP subquery NK_RP", + /* 511 */ "search_condition ::= common_expression", + /* 512 */ "sort_specification_list ::= sort_specification", + /* 513 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 514 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt", + /* 515 */ "ordering_specification_opt ::=", + /* 516 */ "ordering_specification_opt ::= ASC", + /* 517 */ "ordering_specification_opt ::= DESC", + /* 518 */ "null_ordering_opt ::=", + /* 519 */ "null_ordering_opt ::= NULLS FIRST", + /* 520 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -2530,190 +2527,190 @@ static void yy_destructor( */ /********* Begin destructor definitions ***************************************/ /* Default NON-TERMINAL Destructor */ - case 316: /* cmd */ - case 319: /* literal */ - case 330: /* db_options */ - case 332: /* alter_db_options */ - case 338: /* retention */ - case 339: /* full_table_name */ - case 342: /* table_options */ - case 346: /* alter_table_clause */ - case 347: /* alter_table_options */ - case 350: /* signed_literal */ - case 351: /* create_subtable_clause */ - case 354: /* drop_table_clause */ - case 357: /* column_def */ - case 361: /* duration_literal */ - case 362: /* rollup_func_name */ - case 364: /* col_name */ - case 365: /* db_name_cond_opt */ - case 366: /* like_pattern_opt */ - case 367: /* table_name_cond */ - case 368: /* from_db_opt */ - case 369: /* index_options */ - case 371: /* sliding_opt */ - case 372: /* sma_stream_opt */ - case 373: /* func */ - case 374: /* stream_options */ - case 376: /* query_or_subquery */ - case 379: /* explain_options */ - case 383: /* subtable_opt */ - case 384: /* expression */ - case 386: /* where_clause_opt */ - case 387: /* signed */ - case 388: /* literal_func */ - case 392: /* expr_or_subquery */ - case 393: /* subquery */ - case 394: /* pseudo_column */ - case 395: /* column_reference */ - case 396: /* function_expression */ - case 397: /* case_when_expression */ - case 402: /* star_func_para */ - case 404: /* case_when_else_opt */ - case 405: /* common_expression */ - case 406: /* when_then_expr */ - case 407: /* predicate */ - case 410: /* in_predicate_value */ - case 411: /* boolean_value_expression */ - case 412: /* boolean_primary */ - case 413: /* from_clause_opt */ - case 414: /* table_reference_list */ - case 415: /* table_reference */ - case 416: /* table_primary */ - case 417: /* joined_table */ - case 419: /* parenthesized_joined_table */ - case 421: /* search_condition */ - case 422: /* query_specification */ - case 426: /* range_opt */ - case 427: /* every_opt */ - case 428: /* fill_opt */ - case 429: /* twindow_clause_opt */ - case 431: /* having_clause_opt */ - case 432: /* select_item */ - case 434: /* partition_item */ - case 437: /* query_expression */ - case 438: /* query_simple */ - case 440: /* slimit_clause_opt */ - case 441: /* limit_clause_opt */ - case 442: /* union_query_expression */ - case 443: /* query_simple_or_subquery */ - case 445: /* sort_specification */ + case 317: /* cmd */ + case 320: /* literal */ + case 331: /* db_options */ + case 333: /* alter_db_options */ + case 339: /* retention */ + case 340: /* full_table_name */ + case 343: /* table_options */ + case 347: /* alter_table_clause */ + case 348: /* alter_table_options */ + case 351: /* signed_literal */ + case 352: /* create_subtable_clause */ + case 355: /* drop_table_clause */ + case 358: /* column_def */ + case 362: /* duration_literal */ + case 363: /* rollup_func_name */ + case 365: /* col_name */ + case 366: /* db_name_cond_opt */ + case 367: /* like_pattern_opt */ + case 368: /* table_name_cond */ + case 369: /* from_db_opt */ + case 370: /* index_options */ + case 372: /* sliding_opt */ + case 373: /* sma_stream_opt */ + case 374: /* func */ + case 375: /* stream_options */ + case 377: /* query_or_subquery */ + case 380: /* explain_options */ + case 384: /* subtable_opt */ + case 385: /* expression */ + case 387: /* where_clause_opt */ + case 388: /* signed */ + case 389: /* literal_func */ + case 393: /* expr_or_subquery */ + case 394: /* subquery */ + case 395: /* pseudo_column */ + case 396: /* column_reference */ + case 397: /* function_expression */ + case 398: /* case_when_expression */ + case 403: /* star_func_para */ + case 405: /* case_when_else_opt */ + case 406: /* common_expression */ + case 407: /* when_then_expr */ + case 408: /* predicate */ + case 411: /* in_predicate_value */ + case 412: /* boolean_value_expression */ + case 413: /* boolean_primary */ + case 414: /* from_clause_opt */ + case 415: /* table_reference_list */ + case 416: /* table_reference */ + case 417: /* table_primary */ + case 418: /* joined_table */ + case 420: /* parenthesized_joined_table */ + case 422: /* search_condition */ + case 423: /* query_specification */ + case 427: /* range_opt */ + case 428: /* every_opt */ + case 429: /* fill_opt */ + case 430: /* twindow_clause_opt */ + case 432: /* having_clause_opt */ + case 433: /* select_item */ + case 435: /* partition_item */ + case 438: /* query_expression */ + case 439: /* query_simple */ + case 441: /* slimit_clause_opt */ + case 442: /* limit_clause_opt */ + case 443: /* union_query_expression */ + case 444: /* query_simple_or_subquery */ + case 446: /* sort_specification */ { - nodesDestroyNode((yypminor->yy616)); + nodesDestroyNode((yypminor->yy778)); } break; - case 317: /* account_options */ - case 318: /* alter_account_options */ - case 320: /* alter_account_option */ - case 333: /* speed_opt */ - case 381: /* bufsize_opt */ + case 318: /* account_options */ + case 319: /* alter_account_options */ + case 321: /* alter_account_option */ + case 334: /* speed_opt */ + case 382: /* bufsize_opt */ { } break; - case 321: /* user_name */ - case 324: /* priv_level */ - case 327: /* db_name */ - case 328: /* dnode_endpoint */ - case 348: /* column_name */ - case 356: /* table_name */ - case 363: /* function_name */ - case 375: /* topic_name */ - case 377: /* cgroup_name */ - case 382: /* stream_name */ - case 390: /* table_alias */ - case 391: /* column_alias */ - case 398: /* star_func */ - case 400: /* noarg_func */ - case 418: /* alias_opt */ + case 322: /* user_name */ + case 325: /* priv_level */ + case 328: /* db_name */ + case 329: /* dnode_endpoint */ + case 349: /* column_name */ + case 357: /* table_name */ + case 364: /* function_name */ + case 376: /* topic_name */ + case 378: /* cgroup_name */ + case 383: /* stream_name */ + case 391: /* table_alias */ + case 392: /* column_alias */ + case 399: /* star_func */ + case 401: /* noarg_func */ + case 419: /* alias_opt */ { } break; - case 322: /* sysinfo_opt */ + case 323: /* sysinfo_opt */ { } break; - case 323: /* privileges */ - case 325: /* priv_type_list */ - case 326: /* priv_type */ + case 324: /* privileges */ + case 326: /* priv_type_list */ + case 327: /* priv_type */ { } break; - case 329: /* not_exists_opt */ - case 331: /* exists_opt */ - case 378: /* analyze_opt */ - case 380: /* agg_func_opt */ - case 423: /* set_quantifier_opt */ + case 330: /* not_exists_opt */ + case 332: /* exists_opt */ + case 379: /* analyze_opt */ + case 381: /* agg_func_opt */ + case 424: /* set_quantifier_opt */ { } break; - case 334: /* integer_list */ - case 335: /* variable_list */ - case 336: /* retention_list */ - case 340: /* column_def_list */ - case 341: /* tags_def_opt */ - case 343: /* multi_create_clause */ - case 344: /* tags_def */ - case 345: /* multi_drop_clause */ - case 352: /* specific_cols_opt */ - case 353: /* expression_list */ - case 355: /* col_name_list */ - case 358: /* duration_list */ - case 359: /* rollup_func_list */ - case 370: /* func_list */ - case 385: /* dnode_list */ - case 389: /* literal_list */ - case 399: /* star_func_para_list */ - case 401: /* other_para_list */ - case 403: /* when_then_list */ - case 424: /* select_list */ - case 425: /* partition_by_clause_opt */ - case 430: /* group_by_clause_opt */ - case 433: /* partition_list */ - case 436: /* group_by_list */ - case 439: /* order_by_clause_opt */ - case 444: /* sort_specification_list */ + case 335: /* integer_list */ + case 336: /* variable_list */ + case 337: /* retention_list */ + case 341: /* column_def_list */ + case 342: /* tags_def_opt */ + case 344: /* multi_create_clause */ + case 345: /* tags_def */ + case 346: /* multi_drop_clause */ + case 353: /* specific_cols_opt */ + case 354: /* expression_list */ + case 356: /* col_name_list */ + case 359: /* duration_list */ + case 360: /* rollup_func_list */ + case 371: /* func_list */ + case 386: /* dnode_list */ + case 390: /* literal_list */ + case 400: /* star_func_para_list */ + case 402: /* other_para_list */ + case 404: /* when_then_list */ + case 425: /* select_list */ + case 426: /* partition_by_clause_opt */ + case 431: /* group_by_clause_opt */ + case 434: /* partition_list */ + case 437: /* group_by_list */ + case 440: /* order_by_clause_opt */ + case 445: /* sort_specification_list */ { - nodesDestroyList((yypminor->yy152)); + nodesDestroyList((yypminor->yy282)); } break; - case 337: /* alter_db_option */ - case 360: /* alter_table_option */ + case 338: /* alter_db_option */ + case 361: /* alter_table_option */ { } break; - case 349: /* type_name */ + case 350: /* type_name */ { } break; - case 408: /* compare_op */ - case 409: /* in_op */ + case 409: /* compare_op */ + case 410: /* in_op */ { } break; - case 420: /* join_type */ + case 421: /* join_type */ { } break; - case 435: /* fill_mode */ + case 436: /* fill_mode */ { } break; - case 446: /* ordering_specification_opt */ + case 447: /* ordering_specification_opt */ { } break; - case 447: /* null_ordering_opt */ + case 448: /* null_ordering_opt */ { } @@ -3012,525 +3009,527 @@ static const struct { YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ signed char nrhs; /* Negative of the number of RHS symbols in the rule */ } yyRuleInfo[] = { - { 316, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ - { 316, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ - { 317, 0 }, /* (2) account_options ::= */ - { 317, -3 }, /* (3) account_options ::= account_options PPS literal */ - { 317, -3 }, /* (4) account_options ::= account_options TSERIES literal */ - { 317, -3 }, /* (5) account_options ::= account_options STORAGE literal */ - { 317, -3 }, /* (6) account_options ::= account_options STREAMS literal */ - { 317, -3 }, /* (7) account_options ::= account_options QTIME literal */ - { 317, -3 }, /* (8) account_options ::= account_options DBS literal */ - { 317, -3 }, /* (9) account_options ::= account_options USERS literal */ - { 317, -3 }, /* (10) account_options ::= account_options CONNS literal */ - { 317, -3 }, /* (11) account_options ::= account_options STATE literal */ - { 318, -1 }, /* (12) alter_account_options ::= alter_account_option */ - { 318, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ - { 320, -2 }, /* (14) alter_account_option ::= PASS literal */ - { 320, -2 }, /* (15) alter_account_option ::= PPS literal */ - { 320, -2 }, /* (16) alter_account_option ::= TSERIES literal */ - { 320, -2 }, /* (17) alter_account_option ::= STORAGE literal */ - { 320, -2 }, /* (18) alter_account_option ::= STREAMS literal */ - { 320, -2 }, /* (19) alter_account_option ::= QTIME literal */ - { 320, -2 }, /* (20) alter_account_option ::= DBS literal */ - { 320, -2 }, /* (21) alter_account_option ::= USERS literal */ - { 320, -2 }, /* (22) alter_account_option ::= CONNS literal */ - { 320, -2 }, /* (23) alter_account_option ::= STATE literal */ - { 316, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ - { 316, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ - { 316, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ - { 316, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ - { 316, -3 }, /* (28) cmd ::= DROP USER user_name */ - { 322, 0 }, /* (29) sysinfo_opt ::= */ - { 322, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ - { 316, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ - { 316, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ - { 323, -1 }, /* (33) privileges ::= ALL */ - { 323, -1 }, /* (34) privileges ::= priv_type_list */ - { 325, -1 }, /* (35) priv_type_list ::= priv_type */ - { 325, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */ - { 326, -1 }, /* (37) priv_type ::= READ */ - { 326, -1 }, /* (38) priv_type ::= WRITE */ - { 324, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */ - { 324, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */ - { 316, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */ - { 316, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ - { 316, -3 }, /* (43) cmd ::= DROP DNODE NK_INTEGER */ - { 316, -3 }, /* (44) cmd ::= DROP DNODE dnode_endpoint */ - { 316, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ - { 316, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ - { 316, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */ - { 316, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ - { 328, -1 }, /* (49) dnode_endpoint ::= NK_STRING */ - { 328, -1 }, /* (50) dnode_endpoint ::= NK_ID */ - { 328, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */ - { 316, -3 }, /* (52) cmd ::= ALTER LOCAL NK_STRING */ - { 316, -4 }, /* (53) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ - { 316, -5 }, /* (54) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ - { 316, -5 }, /* (55) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ - { 316, -5 }, /* (56) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ - { 316, -5 }, /* (57) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ - { 316, -5 }, /* (58) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ - { 316, -5 }, /* (59) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ - { 316, -5 }, /* (60) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ - { 316, -5 }, /* (61) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ - { 316, -5 }, /* (62) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ - { 316, -4 }, /* (63) cmd ::= DROP DATABASE exists_opt db_name */ - { 316, -2 }, /* (64) cmd ::= USE db_name */ - { 316, -4 }, /* (65) cmd ::= ALTER DATABASE db_name alter_db_options */ - { 316, -3 }, /* (66) cmd ::= FLUSH DATABASE db_name */ - { 316, -4 }, /* (67) cmd ::= TRIM DATABASE db_name speed_opt */ - { 329, -3 }, /* (68) not_exists_opt ::= IF NOT EXISTS */ - { 329, 0 }, /* (69) not_exists_opt ::= */ - { 331, -2 }, /* (70) exists_opt ::= IF EXISTS */ - { 331, 0 }, /* (71) exists_opt ::= */ - { 330, 0 }, /* (72) db_options ::= */ - { 330, -3 }, /* (73) db_options ::= db_options BUFFER NK_INTEGER */ - { 330, -3 }, /* (74) db_options ::= db_options CACHEMODEL NK_STRING */ - { 330, -3 }, /* (75) db_options ::= db_options CACHESIZE NK_INTEGER */ - { 330, -3 }, /* (76) db_options ::= db_options COMP NK_INTEGER */ - { 330, -3 }, /* (77) db_options ::= db_options DURATION NK_INTEGER */ - { 330, -3 }, /* (78) db_options ::= db_options DURATION NK_VARIABLE */ - { 330, -3 }, /* (79) db_options ::= db_options MAXROWS NK_INTEGER */ - { 330, -3 }, /* (80) db_options ::= db_options MINROWS NK_INTEGER */ - { 330, -3 }, /* (81) db_options ::= db_options KEEP integer_list */ - { 330, -3 }, /* (82) db_options ::= db_options KEEP variable_list */ - { 330, -3 }, /* (83) db_options ::= db_options PAGES NK_INTEGER */ - { 330, -3 }, /* (84) db_options ::= db_options PAGESIZE NK_INTEGER */ - { 330, -3 }, /* (85) db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */ - { 330, -3 }, /* (86) db_options ::= db_options PRECISION NK_STRING */ - { 330, -3 }, /* (87) db_options ::= db_options REPLICA NK_INTEGER */ - { 330, -3 }, /* (88) db_options ::= db_options STRICT NK_STRING */ - { 330, -3 }, /* (89) db_options ::= db_options VGROUPS NK_INTEGER */ - { 330, -3 }, /* (90) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ - { 330, -3 }, /* (91) db_options ::= db_options RETENTIONS retention_list */ - { 330, -3 }, /* (92) db_options ::= db_options SCHEMALESS NK_INTEGER */ - { 330, -3 }, /* (93) db_options ::= db_options WAL_LEVEL NK_INTEGER */ - { 330, -3 }, /* (94) db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ - { 330, -3 }, /* (95) db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ - { 330, -4 }, /* (96) db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ - { 330, -3 }, /* (97) db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ - { 330, -4 }, /* (98) db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ - { 330, -3 }, /* (99) db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ - { 330, -3 }, /* (100) db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ - { 330, -3 }, /* (101) db_options ::= db_options STT_TRIGGER NK_INTEGER */ - { 330, -3 }, /* (102) db_options ::= db_options TABLE_PREFIX NK_INTEGER */ - { 330, -3 }, /* (103) db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ - { 332, -1 }, /* (104) alter_db_options ::= alter_db_option */ - { 332, -2 }, /* (105) alter_db_options ::= alter_db_options alter_db_option */ - { 337, -2 }, /* (106) alter_db_option ::= CACHEMODEL NK_STRING */ - { 337, -2 }, /* (107) alter_db_option ::= CACHESIZE NK_INTEGER */ - { 337, -2 }, /* (108) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ - { 337, -2 }, /* (109) alter_db_option ::= KEEP integer_list */ - { 337, -2 }, /* (110) alter_db_option ::= KEEP variable_list */ - { 337, -2 }, /* (111) alter_db_option ::= WAL_LEVEL NK_INTEGER */ - { 337, -2 }, /* (112) alter_db_option ::= STT_TRIGGER NK_INTEGER */ - { 334, -1 }, /* (113) integer_list ::= NK_INTEGER */ - { 334, -3 }, /* (114) integer_list ::= integer_list NK_COMMA NK_INTEGER */ - { 335, -1 }, /* (115) variable_list ::= NK_VARIABLE */ - { 335, -3 }, /* (116) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ - { 336, -1 }, /* (117) retention_list ::= retention */ - { 336, -3 }, /* (118) retention_list ::= retention_list NK_COMMA retention */ - { 338, -3 }, /* (119) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ - { 333, 0 }, /* (120) speed_opt ::= */ - { 333, -2 }, /* (121) speed_opt ::= MAX_SPEED NK_INTEGER */ - { 316, -9 }, /* (122) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ - { 316, -3 }, /* (123) cmd ::= CREATE TABLE multi_create_clause */ - { 316, -9 }, /* (124) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ - { 316, -3 }, /* (125) cmd ::= DROP TABLE multi_drop_clause */ - { 316, -4 }, /* (126) cmd ::= DROP STABLE exists_opt full_table_name */ - { 316, -3 }, /* (127) cmd ::= ALTER TABLE alter_table_clause */ - { 316, -3 }, /* (128) cmd ::= ALTER STABLE alter_table_clause */ - { 346, -2 }, /* (129) alter_table_clause ::= full_table_name alter_table_options */ - { 346, -5 }, /* (130) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ - { 346, -4 }, /* (131) alter_table_clause ::= full_table_name DROP COLUMN column_name */ - { 346, -5 }, /* (132) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ - { 346, -5 }, /* (133) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ - { 346, -5 }, /* (134) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ - { 346, -4 }, /* (135) alter_table_clause ::= full_table_name DROP TAG column_name */ - { 346, -5 }, /* (136) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ - { 346, -5 }, /* (137) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ - { 346, -6 }, /* (138) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ - { 343, -1 }, /* (139) multi_create_clause ::= create_subtable_clause */ - { 343, -2 }, /* (140) multi_create_clause ::= multi_create_clause create_subtable_clause */ - { 351, -10 }, /* (141) create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ - { 345, -1 }, /* (142) multi_drop_clause ::= drop_table_clause */ - { 345, -2 }, /* (143) multi_drop_clause ::= multi_drop_clause drop_table_clause */ - { 354, -2 }, /* (144) drop_table_clause ::= exists_opt full_table_name */ - { 352, 0 }, /* (145) specific_cols_opt ::= */ - { 352, -3 }, /* (146) specific_cols_opt ::= NK_LP col_name_list NK_RP */ - { 339, -1 }, /* (147) full_table_name ::= table_name */ - { 339, -3 }, /* (148) full_table_name ::= db_name NK_DOT table_name */ - { 340, -1 }, /* (149) column_def_list ::= column_def */ - { 340, -3 }, /* (150) column_def_list ::= column_def_list NK_COMMA column_def */ - { 357, -2 }, /* (151) column_def ::= column_name type_name */ - { 357, -4 }, /* (152) column_def ::= column_name type_name COMMENT NK_STRING */ - { 349, -1 }, /* (153) type_name ::= BOOL */ - { 349, -1 }, /* (154) type_name ::= TINYINT */ - { 349, -1 }, /* (155) type_name ::= SMALLINT */ - { 349, -1 }, /* (156) type_name ::= INT */ - { 349, -1 }, /* (157) type_name ::= INTEGER */ - { 349, -1 }, /* (158) type_name ::= BIGINT */ - { 349, -1 }, /* (159) type_name ::= FLOAT */ - { 349, -1 }, /* (160) type_name ::= DOUBLE */ - { 349, -4 }, /* (161) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ - { 349, -1 }, /* (162) type_name ::= TIMESTAMP */ - { 349, -4 }, /* (163) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ - { 349, -2 }, /* (164) type_name ::= TINYINT UNSIGNED */ - { 349, -2 }, /* (165) type_name ::= SMALLINT UNSIGNED */ - { 349, -2 }, /* (166) type_name ::= INT UNSIGNED */ - { 349, -2 }, /* (167) type_name ::= BIGINT UNSIGNED */ - { 349, -1 }, /* (168) type_name ::= JSON */ - { 349, -4 }, /* (169) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ - { 349, -1 }, /* (170) type_name ::= MEDIUMBLOB */ - { 349, -1 }, /* (171) type_name ::= BLOB */ - { 349, -4 }, /* (172) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ - { 349, -1 }, /* (173) type_name ::= DECIMAL */ - { 349, -4 }, /* (174) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ - { 349, -6 }, /* (175) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ - { 341, 0 }, /* (176) tags_def_opt ::= */ - { 341, -1 }, /* (177) tags_def_opt ::= tags_def */ - { 344, -4 }, /* (178) tags_def ::= TAGS NK_LP column_def_list NK_RP */ - { 342, 0 }, /* (179) table_options ::= */ - { 342, -3 }, /* (180) table_options ::= table_options COMMENT NK_STRING */ - { 342, -3 }, /* (181) table_options ::= table_options MAX_DELAY duration_list */ - { 342, -3 }, /* (182) table_options ::= table_options WATERMARK duration_list */ - { 342, -5 }, /* (183) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ - { 342, -3 }, /* (184) table_options ::= table_options TTL NK_INTEGER */ - { 342, -5 }, /* (185) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ - { 347, -1 }, /* (186) alter_table_options ::= alter_table_option */ - { 347, -2 }, /* (187) alter_table_options ::= alter_table_options alter_table_option */ - { 360, -2 }, /* (188) alter_table_option ::= COMMENT NK_STRING */ - { 360, -2 }, /* (189) alter_table_option ::= TTL NK_INTEGER */ - { 358, -1 }, /* (190) duration_list ::= duration_literal */ - { 358, -3 }, /* (191) duration_list ::= duration_list NK_COMMA duration_literal */ - { 359, -1 }, /* (192) rollup_func_list ::= rollup_func_name */ - { 359, -3 }, /* (193) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ - { 362, -1 }, /* (194) rollup_func_name ::= function_name */ - { 362, -1 }, /* (195) rollup_func_name ::= FIRST */ - { 362, -1 }, /* (196) rollup_func_name ::= LAST */ - { 355, -1 }, /* (197) col_name_list ::= col_name */ - { 355, -3 }, /* (198) col_name_list ::= col_name_list NK_COMMA col_name */ - { 364, -1 }, /* (199) col_name ::= column_name */ - { 316, -2 }, /* (200) cmd ::= SHOW DNODES */ - { 316, -2 }, /* (201) cmd ::= SHOW USERS */ - { 316, -2 }, /* (202) cmd ::= SHOW DATABASES */ - { 316, -4 }, /* (203) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ - { 316, -4 }, /* (204) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ - { 316, -3 }, /* (205) cmd ::= SHOW db_name_cond_opt VGROUPS */ - { 316, -2 }, /* (206) cmd ::= SHOW MNODES */ - { 316, -2 }, /* (207) cmd ::= SHOW MODULES */ - { 316, -2 }, /* (208) cmd ::= SHOW QNODES */ - { 316, -2 }, /* (209) cmd ::= SHOW FUNCTIONS */ - { 316, -5 }, /* (210) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ - { 316, -2 }, /* (211) cmd ::= SHOW STREAMS */ - { 316, -2 }, /* (212) cmd ::= SHOW ACCOUNTS */ - { 316, -2 }, /* (213) cmd ::= SHOW APPS */ - { 316, -2 }, /* (214) cmd ::= SHOW CONNECTIONS */ - { 316, -2 }, /* (215) cmd ::= SHOW LICENCES */ - { 316, -2 }, /* (216) cmd ::= SHOW GRANTS */ - { 316, -4 }, /* (217) cmd ::= SHOW CREATE DATABASE db_name */ - { 316, -4 }, /* (218) cmd ::= SHOW CREATE TABLE full_table_name */ - { 316, -4 }, /* (219) cmd ::= SHOW CREATE STABLE full_table_name */ - { 316, -2 }, /* (220) cmd ::= SHOW QUERIES */ - { 316, -2 }, /* (221) cmd ::= SHOW SCORES */ - { 316, -2 }, /* (222) cmd ::= SHOW TOPICS */ - { 316, -2 }, /* (223) cmd ::= SHOW VARIABLES */ - { 316, -3 }, /* (224) cmd ::= SHOW LOCAL VARIABLES */ - { 316, -4 }, /* (225) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ - { 316, -2 }, /* (226) cmd ::= SHOW BNODES */ - { 316, -2 }, /* (227) cmd ::= SHOW SNODES */ - { 316, -2 }, /* (228) cmd ::= SHOW CLUSTER */ - { 316, -2 }, /* (229) cmd ::= SHOW TRANSACTIONS */ - { 316, -4 }, /* (230) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ - { 316, -2 }, /* (231) cmd ::= SHOW CONSUMERS */ - { 316, -2 }, /* (232) cmd ::= SHOW SUBSCRIPTIONS */ - { 316, -5 }, /* (233) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ - { 316, -3 }, /* (234) cmd ::= SHOW VNODES NK_INTEGER */ - { 316, -3 }, /* (235) cmd ::= SHOW VNODES NK_STRING */ - { 365, 0 }, /* (236) db_name_cond_opt ::= */ - { 365, -2 }, /* (237) db_name_cond_opt ::= db_name NK_DOT */ - { 366, 0 }, /* (238) like_pattern_opt ::= */ - { 366, -2 }, /* (239) like_pattern_opt ::= LIKE NK_STRING */ - { 367, -1 }, /* (240) table_name_cond ::= table_name */ - { 368, 0 }, /* (241) from_db_opt ::= */ - { 368, -2 }, /* (242) from_db_opt ::= FROM db_name */ - { 316, -8 }, /* (243) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ - { 316, -4 }, /* (244) cmd ::= DROP INDEX exists_opt full_table_name */ - { 369, -10 }, /* (245) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ - { 369, -12 }, /* (246) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ - { 370, -1 }, /* (247) func_list ::= func */ - { 370, -3 }, /* (248) func_list ::= func_list NK_COMMA func */ - { 373, -4 }, /* (249) func ::= function_name NK_LP expression_list NK_RP */ - { 372, 0 }, /* (250) sma_stream_opt ::= */ - { 372, -3 }, /* (251) sma_stream_opt ::= stream_options WATERMARK duration_literal */ - { 372, -3 }, /* (252) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ - { 316, -6 }, /* (253) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ - { 316, -7 }, /* (254) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ - { 316, -9 }, /* (255) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ - { 316, -7 }, /* (256) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ - { 316, -9 }, /* (257) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ - { 316, -4 }, /* (258) cmd ::= DROP TOPIC exists_opt topic_name */ - { 316, -7 }, /* (259) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ - { 316, -2 }, /* (260) cmd ::= DESC full_table_name */ - { 316, -2 }, /* (261) cmd ::= DESCRIBE full_table_name */ - { 316, -3 }, /* (262) cmd ::= RESET QUERY CACHE */ - { 316, -4 }, /* (263) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ - { 378, 0 }, /* (264) analyze_opt ::= */ - { 378, -1 }, /* (265) analyze_opt ::= ANALYZE */ - { 379, 0 }, /* (266) explain_options ::= */ - { 379, -3 }, /* (267) explain_options ::= explain_options VERBOSE NK_BOOL */ - { 379, -3 }, /* (268) explain_options ::= explain_options RATIO NK_FLOAT */ - { 316, -10 }, /* (269) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ - { 316, -4 }, /* (270) cmd ::= DROP FUNCTION exists_opt function_name */ - { 380, 0 }, /* (271) agg_func_opt ::= */ - { 380, -1 }, /* (272) agg_func_opt ::= AGGREGATE */ - { 381, 0 }, /* (273) bufsize_opt ::= */ - { 381, -2 }, /* (274) bufsize_opt ::= BUFSIZE NK_INTEGER */ - { 316, -11 }, /* (275) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ - { 316, -4 }, /* (276) cmd ::= DROP STREAM exists_opt stream_name */ - { 374, 0 }, /* (277) stream_options ::= */ - { 374, -3 }, /* (278) stream_options ::= stream_options TRIGGER AT_ONCE */ - { 374, -3 }, /* (279) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ - { 374, -4 }, /* (280) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ - { 374, -3 }, /* (281) stream_options ::= stream_options WATERMARK duration_literal */ - { 374, -4 }, /* (282) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ - { 383, 0 }, /* (283) subtable_opt ::= */ - { 383, -4 }, /* (284) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ - { 316, -3 }, /* (285) cmd ::= KILL CONNECTION NK_INTEGER */ - { 316, -3 }, /* (286) cmd ::= KILL QUERY NK_STRING */ - { 316, -3 }, /* (287) cmd ::= KILL TRANSACTION NK_INTEGER */ - { 316, -2 }, /* (288) cmd ::= BALANCE VGROUP */ - { 316, -4 }, /* (289) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ - { 316, -4 }, /* (290) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ - { 316, -3 }, /* (291) cmd ::= SPLIT VGROUP NK_INTEGER */ - { 385, -2 }, /* (292) dnode_list ::= DNODE NK_INTEGER */ - { 385, -3 }, /* (293) dnode_list ::= dnode_list DNODE NK_INTEGER */ - { 316, -4 }, /* (294) cmd ::= DELETE FROM full_table_name where_clause_opt */ - { 316, -1 }, /* (295) cmd ::= query_or_subquery */ - { 316, -7 }, /* (296) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ - { 316, -4 }, /* (297) cmd ::= INSERT INTO full_table_name query_or_subquery */ - { 319, -1 }, /* (298) literal ::= NK_INTEGER */ - { 319, -1 }, /* (299) literal ::= NK_FLOAT */ - { 319, -1 }, /* (300) literal ::= NK_STRING */ - { 319, -1 }, /* (301) literal ::= NK_BOOL */ - { 319, -2 }, /* (302) literal ::= TIMESTAMP NK_STRING */ - { 319, -1 }, /* (303) literal ::= duration_literal */ - { 319, -1 }, /* (304) literal ::= NULL */ - { 319, -1 }, /* (305) literal ::= NK_QUESTION */ - { 361, -1 }, /* (306) duration_literal ::= NK_VARIABLE */ - { 387, -1 }, /* (307) signed ::= NK_INTEGER */ - { 387, -2 }, /* (308) signed ::= NK_PLUS NK_INTEGER */ - { 387, -2 }, /* (309) signed ::= NK_MINUS NK_INTEGER */ - { 387, -1 }, /* (310) signed ::= NK_FLOAT */ - { 387, -2 }, /* (311) signed ::= NK_PLUS NK_FLOAT */ - { 387, -2 }, /* (312) signed ::= NK_MINUS NK_FLOAT */ - { 350, -1 }, /* (313) signed_literal ::= signed */ - { 350, -1 }, /* (314) signed_literal ::= NK_STRING */ - { 350, -1 }, /* (315) signed_literal ::= NK_BOOL */ - { 350, -2 }, /* (316) signed_literal ::= TIMESTAMP NK_STRING */ - { 350, -1 }, /* (317) signed_literal ::= duration_literal */ - { 350, -1 }, /* (318) signed_literal ::= NULL */ - { 350, -1 }, /* (319) signed_literal ::= literal_func */ - { 350, -1 }, /* (320) signed_literal ::= NK_QUESTION */ - { 389, -1 }, /* (321) literal_list ::= signed_literal */ - { 389, -3 }, /* (322) literal_list ::= literal_list NK_COMMA signed_literal */ - { 327, -1 }, /* (323) db_name ::= NK_ID */ - { 356, -1 }, /* (324) table_name ::= NK_ID */ - { 348, -1 }, /* (325) column_name ::= NK_ID */ - { 363, -1 }, /* (326) function_name ::= NK_ID */ - { 390, -1 }, /* (327) table_alias ::= NK_ID */ - { 391, -1 }, /* (328) column_alias ::= NK_ID */ - { 321, -1 }, /* (329) user_name ::= NK_ID */ - { 375, -1 }, /* (330) topic_name ::= NK_ID */ - { 382, -1 }, /* (331) stream_name ::= NK_ID */ - { 377, -1 }, /* (332) cgroup_name ::= NK_ID */ - { 392, -1 }, /* (333) expr_or_subquery ::= expression */ - { 392, -1 }, /* (334) expr_or_subquery ::= subquery */ - { 384, -1 }, /* (335) expression ::= literal */ - { 384, -1 }, /* (336) expression ::= pseudo_column */ - { 384, -1 }, /* (337) expression ::= column_reference */ - { 384, -1 }, /* (338) expression ::= function_expression */ - { 384, -1 }, /* (339) expression ::= case_when_expression */ - { 384, -3 }, /* (340) expression ::= NK_LP expression NK_RP */ - { 384, -2 }, /* (341) expression ::= NK_PLUS expr_or_subquery */ - { 384, -2 }, /* (342) expression ::= NK_MINUS expr_or_subquery */ - { 384, -3 }, /* (343) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ - { 384, -3 }, /* (344) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ - { 384, -3 }, /* (345) expression ::= expr_or_subquery NK_STAR expr_or_subquery */ - { 384, -3 }, /* (346) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ - { 384, -3 }, /* (347) expression ::= expr_or_subquery NK_REM expr_or_subquery */ - { 384, -3 }, /* (348) expression ::= column_reference NK_ARROW NK_STRING */ - { 384, -3 }, /* (349) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ - { 384, -3 }, /* (350) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ - { 353, -1 }, /* (351) expression_list ::= expr_or_subquery */ - { 353, -3 }, /* (352) expression_list ::= expression_list NK_COMMA expr_or_subquery */ - { 395, -1 }, /* (353) column_reference ::= column_name */ - { 395, -3 }, /* (354) column_reference ::= table_name NK_DOT column_name */ - { 394, -1 }, /* (355) pseudo_column ::= ROWTS */ - { 394, -1 }, /* (356) pseudo_column ::= TBNAME */ - { 394, -3 }, /* (357) pseudo_column ::= table_name NK_DOT TBNAME */ - { 394, -1 }, /* (358) pseudo_column ::= QSTART */ - { 394, -1 }, /* (359) pseudo_column ::= QEND */ - { 394, -1 }, /* (360) pseudo_column ::= QDURATION */ - { 394, -1 }, /* (361) pseudo_column ::= WSTART */ - { 394, -1 }, /* (362) pseudo_column ::= WEND */ - { 394, -1 }, /* (363) pseudo_column ::= WDURATION */ - { 394, -1 }, /* (364) pseudo_column ::= IROWTS */ - { 396, -4 }, /* (365) function_expression ::= function_name NK_LP expression_list NK_RP */ - { 396, -4 }, /* (366) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ - { 396, -6 }, /* (367) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ - { 396, -1 }, /* (368) function_expression ::= literal_func */ - { 388, -3 }, /* (369) literal_func ::= noarg_func NK_LP NK_RP */ - { 388, -1 }, /* (370) literal_func ::= NOW */ - { 400, -1 }, /* (371) noarg_func ::= NOW */ - { 400, -1 }, /* (372) noarg_func ::= TODAY */ - { 400, -1 }, /* (373) noarg_func ::= TIMEZONE */ - { 400, -1 }, /* (374) noarg_func ::= DATABASE */ - { 400, -1 }, /* (375) noarg_func ::= CLIENT_VERSION */ - { 400, -1 }, /* (376) noarg_func ::= SERVER_VERSION */ - { 400, -1 }, /* (377) noarg_func ::= SERVER_STATUS */ - { 400, -1 }, /* (378) noarg_func ::= CURRENT_USER */ - { 400, -1 }, /* (379) noarg_func ::= USER */ - { 398, -1 }, /* (380) star_func ::= COUNT */ - { 398, -1 }, /* (381) star_func ::= FIRST */ - { 398, -1 }, /* (382) star_func ::= LAST */ - { 398, -1 }, /* (383) star_func ::= LAST_ROW */ - { 399, -1 }, /* (384) star_func_para_list ::= NK_STAR */ - { 399, -1 }, /* (385) star_func_para_list ::= other_para_list */ - { 401, -1 }, /* (386) other_para_list ::= star_func_para */ - { 401, -3 }, /* (387) other_para_list ::= other_para_list NK_COMMA star_func_para */ - { 402, -1 }, /* (388) star_func_para ::= expr_or_subquery */ - { 402, -3 }, /* (389) star_func_para ::= table_name NK_DOT NK_STAR */ - { 397, -4 }, /* (390) case_when_expression ::= CASE when_then_list case_when_else_opt END */ - { 397, -5 }, /* (391) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ - { 403, -1 }, /* (392) when_then_list ::= when_then_expr */ - { 403, -2 }, /* (393) when_then_list ::= when_then_list when_then_expr */ - { 406, -4 }, /* (394) when_then_expr ::= WHEN common_expression THEN common_expression */ - { 404, 0 }, /* (395) case_when_else_opt ::= */ - { 404, -2 }, /* (396) case_when_else_opt ::= ELSE common_expression */ - { 407, -3 }, /* (397) predicate ::= expr_or_subquery compare_op expr_or_subquery */ - { 407, -5 }, /* (398) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ - { 407, -6 }, /* (399) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ - { 407, -3 }, /* (400) predicate ::= expr_or_subquery IS NULL */ - { 407, -4 }, /* (401) predicate ::= expr_or_subquery IS NOT NULL */ - { 407, -3 }, /* (402) predicate ::= expr_or_subquery in_op in_predicate_value */ - { 408, -1 }, /* (403) compare_op ::= NK_LT */ - { 408, -1 }, /* (404) compare_op ::= NK_GT */ - { 408, -1 }, /* (405) compare_op ::= NK_LE */ - { 408, -1 }, /* (406) compare_op ::= NK_GE */ - { 408, -1 }, /* (407) compare_op ::= NK_NE */ - { 408, -1 }, /* (408) compare_op ::= NK_EQ */ - { 408, -1 }, /* (409) compare_op ::= LIKE */ - { 408, -2 }, /* (410) compare_op ::= NOT LIKE */ - { 408, -1 }, /* (411) compare_op ::= MATCH */ - { 408, -1 }, /* (412) compare_op ::= NMATCH */ - { 408, -1 }, /* (413) compare_op ::= CONTAINS */ - { 409, -1 }, /* (414) in_op ::= IN */ - { 409, -2 }, /* (415) in_op ::= NOT IN */ - { 410, -3 }, /* (416) in_predicate_value ::= NK_LP literal_list NK_RP */ - { 411, -1 }, /* (417) boolean_value_expression ::= boolean_primary */ - { 411, -2 }, /* (418) boolean_value_expression ::= NOT boolean_primary */ - { 411, -3 }, /* (419) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 411, -3 }, /* (420) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 412, -1 }, /* (421) boolean_primary ::= predicate */ - { 412, -3 }, /* (422) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 405, -1 }, /* (423) common_expression ::= expr_or_subquery */ - { 405, -1 }, /* (424) common_expression ::= boolean_value_expression */ - { 413, 0 }, /* (425) from_clause_opt ::= */ - { 413, -2 }, /* (426) from_clause_opt ::= FROM table_reference_list */ - { 414, -1 }, /* (427) table_reference_list ::= table_reference */ - { 414, -3 }, /* (428) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 415, -1 }, /* (429) table_reference ::= table_primary */ - { 415, -1 }, /* (430) table_reference ::= joined_table */ - { 416, -2 }, /* (431) table_primary ::= table_name alias_opt */ - { 416, -4 }, /* (432) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 416, -2 }, /* (433) table_primary ::= subquery alias_opt */ - { 416, -1 }, /* (434) table_primary ::= parenthesized_joined_table */ - { 418, 0 }, /* (435) alias_opt ::= */ - { 418, -1 }, /* (436) alias_opt ::= table_alias */ - { 418, -2 }, /* (437) alias_opt ::= AS table_alias */ - { 419, -3 }, /* (438) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 419, -3 }, /* (439) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 417, -6 }, /* (440) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 420, 0 }, /* (441) join_type ::= */ - { 420, -1 }, /* (442) join_type ::= INNER */ - { 422, -12 }, /* (443) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ - { 423, 0 }, /* (444) set_quantifier_opt ::= */ - { 423, -1 }, /* (445) set_quantifier_opt ::= DISTINCT */ - { 423, -1 }, /* (446) set_quantifier_opt ::= ALL */ - { 424, -1 }, /* (447) select_list ::= select_item */ - { 424, -3 }, /* (448) select_list ::= select_list NK_COMMA select_item */ - { 432, -1 }, /* (449) select_item ::= NK_STAR */ - { 432, -1 }, /* (450) select_item ::= common_expression */ - { 432, -2 }, /* (451) select_item ::= common_expression column_alias */ - { 432, -3 }, /* (452) select_item ::= common_expression AS column_alias */ - { 432, -3 }, /* (453) select_item ::= table_name NK_DOT NK_STAR */ - { 386, 0 }, /* (454) where_clause_opt ::= */ - { 386, -2 }, /* (455) where_clause_opt ::= WHERE search_condition */ - { 425, 0 }, /* (456) partition_by_clause_opt ::= */ - { 425, -3 }, /* (457) partition_by_clause_opt ::= PARTITION BY partition_list */ - { 433, -1 }, /* (458) partition_list ::= partition_item */ - { 433, -3 }, /* (459) partition_list ::= partition_list NK_COMMA partition_item */ - { 434, -1 }, /* (460) partition_item ::= expr_or_subquery */ - { 434, -2 }, /* (461) partition_item ::= expr_or_subquery column_alias */ - { 434, -3 }, /* (462) partition_item ::= expr_or_subquery AS column_alias */ - { 429, 0 }, /* (463) twindow_clause_opt ::= */ - { 429, -6 }, /* (464) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ - { 429, -4 }, /* (465) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ - { 429, -6 }, /* (466) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 429, -8 }, /* (467) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 371, 0 }, /* (468) sliding_opt ::= */ - { 371, -4 }, /* (469) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 428, 0 }, /* (470) fill_opt ::= */ - { 428, -4 }, /* (471) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 428, -6 }, /* (472) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 435, -1 }, /* (473) fill_mode ::= NONE */ - { 435, -1 }, /* (474) fill_mode ::= PREV */ - { 435, -1 }, /* (475) fill_mode ::= NULL */ - { 435, -1 }, /* (476) fill_mode ::= LINEAR */ - { 435, -1 }, /* (477) fill_mode ::= NEXT */ - { 430, 0 }, /* (478) group_by_clause_opt ::= */ - { 430, -3 }, /* (479) group_by_clause_opt ::= GROUP BY group_by_list */ - { 436, -1 }, /* (480) group_by_list ::= expr_or_subquery */ - { 436, -3 }, /* (481) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ - { 431, 0 }, /* (482) having_clause_opt ::= */ - { 431, -2 }, /* (483) having_clause_opt ::= HAVING search_condition */ - { 426, 0 }, /* (484) range_opt ::= */ - { 426, -6 }, /* (485) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ - { 427, 0 }, /* (486) every_opt ::= */ - { 427, -4 }, /* (487) every_opt ::= EVERY NK_LP duration_literal NK_RP */ - { 437, -4 }, /* (488) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 438, -1 }, /* (489) query_simple ::= query_specification */ - { 438, -1 }, /* (490) query_simple ::= union_query_expression */ - { 442, -4 }, /* (491) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ - { 442, -3 }, /* (492) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ - { 443, -1 }, /* (493) query_simple_or_subquery ::= query_simple */ - { 443, -1 }, /* (494) query_simple_or_subquery ::= subquery */ - { 376, -1 }, /* (495) query_or_subquery ::= query_expression */ - { 376, -1 }, /* (496) query_or_subquery ::= subquery */ - { 439, 0 }, /* (497) order_by_clause_opt ::= */ - { 439, -3 }, /* (498) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 440, 0 }, /* (499) slimit_clause_opt ::= */ - { 440, -2 }, /* (500) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 440, -4 }, /* (501) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 440, -4 }, /* (502) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 441, 0 }, /* (503) limit_clause_opt ::= */ - { 441, -2 }, /* (504) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 441, -4 }, /* (505) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 441, -4 }, /* (506) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 393, -3 }, /* (507) subquery ::= NK_LP query_expression NK_RP */ - { 393, -3 }, /* (508) subquery ::= NK_LP subquery NK_RP */ - { 421, -1 }, /* (509) search_condition ::= common_expression */ - { 444, -1 }, /* (510) sort_specification_list ::= sort_specification */ - { 444, -3 }, /* (511) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 445, -3 }, /* (512) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ - { 446, 0 }, /* (513) ordering_specification_opt ::= */ - { 446, -1 }, /* (514) ordering_specification_opt ::= ASC */ - { 446, -1 }, /* (515) ordering_specification_opt ::= DESC */ - { 447, 0 }, /* (516) null_ordering_opt ::= */ - { 447, -2 }, /* (517) null_ordering_opt ::= NULLS FIRST */ - { 447, -2 }, /* (518) null_ordering_opt ::= NULLS LAST */ + { 317, -6 }, /* (0) cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ + { 317, -4 }, /* (1) cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ + { 318, 0 }, /* (2) account_options ::= */ + { 318, -3 }, /* (3) account_options ::= account_options PPS literal */ + { 318, -3 }, /* (4) account_options ::= account_options TSERIES literal */ + { 318, -3 }, /* (5) account_options ::= account_options STORAGE literal */ + { 318, -3 }, /* (6) account_options ::= account_options STREAMS literal */ + { 318, -3 }, /* (7) account_options ::= account_options QTIME literal */ + { 318, -3 }, /* (8) account_options ::= account_options DBS literal */ + { 318, -3 }, /* (9) account_options ::= account_options USERS literal */ + { 318, -3 }, /* (10) account_options ::= account_options CONNS literal */ + { 318, -3 }, /* (11) account_options ::= account_options STATE literal */ + { 319, -1 }, /* (12) alter_account_options ::= alter_account_option */ + { 319, -2 }, /* (13) alter_account_options ::= alter_account_options alter_account_option */ + { 321, -2 }, /* (14) alter_account_option ::= PASS literal */ + { 321, -2 }, /* (15) alter_account_option ::= PPS literal */ + { 321, -2 }, /* (16) alter_account_option ::= TSERIES literal */ + { 321, -2 }, /* (17) alter_account_option ::= STORAGE literal */ + { 321, -2 }, /* (18) alter_account_option ::= STREAMS literal */ + { 321, -2 }, /* (19) alter_account_option ::= QTIME literal */ + { 321, -2 }, /* (20) alter_account_option ::= DBS literal */ + { 321, -2 }, /* (21) alter_account_option ::= USERS literal */ + { 321, -2 }, /* (22) alter_account_option ::= CONNS literal */ + { 321, -2 }, /* (23) alter_account_option ::= STATE literal */ + { 317, -6 }, /* (24) cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ + { 317, -5 }, /* (25) cmd ::= ALTER USER user_name PASS NK_STRING */ + { 317, -5 }, /* (26) cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ + { 317, -5 }, /* (27) cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ + { 317, -3 }, /* (28) cmd ::= DROP USER user_name */ + { 323, 0 }, /* (29) sysinfo_opt ::= */ + { 323, -2 }, /* (30) sysinfo_opt ::= SYSINFO NK_INTEGER */ + { 317, -6 }, /* (31) cmd ::= GRANT privileges ON priv_level TO user_name */ + { 317, -6 }, /* (32) cmd ::= REVOKE privileges ON priv_level FROM user_name */ + { 324, -1 }, /* (33) privileges ::= ALL */ + { 324, -1 }, /* (34) privileges ::= priv_type_list */ + { 326, -1 }, /* (35) priv_type_list ::= priv_type */ + { 326, -3 }, /* (36) priv_type_list ::= priv_type_list NK_COMMA priv_type */ + { 327, -1 }, /* (37) priv_type ::= READ */ + { 327, -1 }, /* (38) priv_type ::= WRITE */ + { 325, -3 }, /* (39) priv_level ::= NK_STAR NK_DOT NK_STAR */ + { 325, -3 }, /* (40) priv_level ::= db_name NK_DOT NK_STAR */ + { 317, -3 }, /* (41) cmd ::= CREATE DNODE dnode_endpoint */ + { 317, -5 }, /* (42) cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ + { 317, -3 }, /* (43) cmd ::= DROP DNODE NK_INTEGER */ + { 317, -3 }, /* (44) cmd ::= DROP DNODE dnode_endpoint */ + { 317, -4 }, /* (45) cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ + { 317, -5 }, /* (46) cmd ::= ALTER DNODE NK_INTEGER NK_STRING NK_STRING */ + { 317, -4 }, /* (47) cmd ::= ALTER ALL DNODES NK_STRING */ + { 317, -5 }, /* (48) cmd ::= ALTER ALL DNODES NK_STRING NK_STRING */ + { 329, -1 }, /* (49) dnode_endpoint ::= NK_STRING */ + { 329, -1 }, /* (50) dnode_endpoint ::= NK_ID */ + { 329, -1 }, /* (51) dnode_endpoint ::= NK_IPTOKEN */ + { 317, -3 }, /* (52) cmd ::= ALTER LOCAL NK_STRING */ + { 317, -4 }, /* (53) cmd ::= ALTER LOCAL NK_STRING NK_STRING */ + { 317, -5 }, /* (54) cmd ::= CREATE QNODE ON DNODE NK_INTEGER */ + { 317, -5 }, /* (55) cmd ::= DROP QNODE ON DNODE NK_INTEGER */ + { 317, -5 }, /* (56) cmd ::= CREATE BNODE ON DNODE NK_INTEGER */ + { 317, -5 }, /* (57) cmd ::= DROP BNODE ON DNODE NK_INTEGER */ + { 317, -5 }, /* (58) cmd ::= CREATE SNODE ON DNODE NK_INTEGER */ + { 317, -5 }, /* (59) cmd ::= DROP SNODE ON DNODE NK_INTEGER */ + { 317, -5 }, /* (60) cmd ::= CREATE MNODE ON DNODE NK_INTEGER */ + { 317, -5 }, /* (61) cmd ::= DROP MNODE ON DNODE NK_INTEGER */ + { 317, -5 }, /* (62) cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ + { 317, -4 }, /* (63) cmd ::= DROP DATABASE exists_opt db_name */ + { 317, -2 }, /* (64) cmd ::= USE db_name */ + { 317, -4 }, /* (65) cmd ::= ALTER DATABASE db_name alter_db_options */ + { 317, -3 }, /* (66) cmd ::= FLUSH DATABASE db_name */ + { 317, -4 }, /* (67) cmd ::= TRIM DATABASE db_name speed_opt */ + { 330, -3 }, /* (68) not_exists_opt ::= IF NOT EXISTS */ + { 330, 0 }, /* (69) not_exists_opt ::= */ + { 332, -2 }, /* (70) exists_opt ::= IF EXISTS */ + { 332, 0 }, /* (71) exists_opt ::= */ + { 331, 0 }, /* (72) db_options ::= */ + { 331, -3 }, /* (73) db_options ::= db_options BUFFER NK_INTEGER */ + { 331, -3 }, /* (74) db_options ::= db_options CACHEMODEL NK_STRING */ + { 331, -3 }, /* (75) db_options ::= db_options CACHESIZE NK_INTEGER */ + { 331, -3 }, /* (76) db_options ::= db_options COMP NK_INTEGER */ + { 331, -3 }, /* (77) db_options ::= db_options DURATION NK_INTEGER */ + { 331, -3 }, /* (78) db_options ::= db_options DURATION NK_VARIABLE */ + { 331, -3 }, /* (79) db_options ::= db_options MAXROWS NK_INTEGER */ + { 331, -3 }, /* (80) db_options ::= db_options MINROWS NK_INTEGER */ + { 331, -3 }, /* (81) db_options ::= db_options KEEP integer_list */ + { 331, -3 }, /* (82) db_options ::= db_options KEEP variable_list */ + { 331, -3 }, /* (83) db_options ::= db_options PAGES NK_INTEGER */ + { 331, -3 }, /* (84) db_options ::= db_options PAGESIZE NK_INTEGER */ + { 331, -3 }, /* (85) db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */ + { 331, -3 }, /* (86) db_options ::= db_options PRECISION NK_STRING */ + { 331, -3 }, /* (87) db_options ::= db_options REPLICA NK_INTEGER */ + { 331, -3 }, /* (88) db_options ::= db_options STRICT NK_STRING */ + { 331, -3 }, /* (89) db_options ::= db_options VGROUPS NK_INTEGER */ + { 331, -3 }, /* (90) db_options ::= db_options SINGLE_STABLE NK_INTEGER */ + { 331, -3 }, /* (91) db_options ::= db_options RETENTIONS retention_list */ + { 331, -3 }, /* (92) db_options ::= db_options SCHEMALESS NK_INTEGER */ + { 331, -3 }, /* (93) db_options ::= db_options WAL_LEVEL NK_INTEGER */ + { 331, -3 }, /* (94) db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ + { 331, -3 }, /* (95) db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ + { 331, -4 }, /* (96) db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ + { 331, -3 }, /* (97) db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ + { 331, -4 }, /* (98) db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ + { 331, -3 }, /* (99) db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ + { 331, -3 }, /* (100) db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ + { 331, -3 }, /* (101) db_options ::= db_options STT_TRIGGER NK_INTEGER */ + { 331, -3 }, /* (102) db_options ::= db_options TABLE_PREFIX NK_INTEGER */ + { 331, -3 }, /* (103) db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ + { 333, -1 }, /* (104) alter_db_options ::= alter_db_option */ + { 333, -2 }, /* (105) alter_db_options ::= alter_db_options alter_db_option */ + { 338, -2 }, /* (106) alter_db_option ::= CACHEMODEL NK_STRING */ + { 338, -2 }, /* (107) alter_db_option ::= CACHESIZE NK_INTEGER */ + { 338, -2 }, /* (108) alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ + { 338, -2 }, /* (109) alter_db_option ::= KEEP integer_list */ + { 338, -2 }, /* (110) alter_db_option ::= KEEP variable_list */ + { 338, -2 }, /* (111) alter_db_option ::= WAL_LEVEL NK_INTEGER */ + { 338, -2 }, /* (112) alter_db_option ::= STT_TRIGGER NK_INTEGER */ + { 335, -1 }, /* (113) integer_list ::= NK_INTEGER */ + { 335, -3 }, /* (114) integer_list ::= integer_list NK_COMMA NK_INTEGER */ + { 336, -1 }, /* (115) variable_list ::= NK_VARIABLE */ + { 336, -3 }, /* (116) variable_list ::= variable_list NK_COMMA NK_VARIABLE */ + { 337, -1 }, /* (117) retention_list ::= retention */ + { 337, -3 }, /* (118) retention_list ::= retention_list NK_COMMA retention */ + { 339, -3 }, /* (119) retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ + { 334, 0 }, /* (120) speed_opt ::= */ + { 334, -2 }, /* (121) speed_opt ::= MAX_SPEED NK_INTEGER */ + { 317, -9 }, /* (122) cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ + { 317, -3 }, /* (123) cmd ::= CREATE TABLE multi_create_clause */ + { 317, -9 }, /* (124) cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ + { 317, -3 }, /* (125) cmd ::= DROP TABLE multi_drop_clause */ + { 317, -4 }, /* (126) cmd ::= DROP STABLE exists_opt full_table_name */ + { 317, -3 }, /* (127) cmd ::= ALTER TABLE alter_table_clause */ + { 317, -3 }, /* (128) cmd ::= ALTER STABLE alter_table_clause */ + { 347, -2 }, /* (129) alter_table_clause ::= full_table_name alter_table_options */ + { 347, -5 }, /* (130) alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ + { 347, -4 }, /* (131) alter_table_clause ::= full_table_name DROP COLUMN column_name */ + { 347, -5 }, /* (132) alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ + { 347, -5 }, /* (133) alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ + { 347, -5 }, /* (134) alter_table_clause ::= full_table_name ADD TAG column_name type_name */ + { 347, -4 }, /* (135) alter_table_clause ::= full_table_name DROP TAG column_name */ + { 347, -5 }, /* (136) alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ + { 347, -5 }, /* (137) alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ + { 347, -6 }, /* (138) alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ + { 344, -1 }, /* (139) multi_create_clause ::= create_subtable_clause */ + { 344, -2 }, /* (140) multi_create_clause ::= multi_create_clause create_subtable_clause */ + { 352, -10 }, /* (141) create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ + { 346, -1 }, /* (142) multi_drop_clause ::= drop_table_clause */ + { 346, -2 }, /* (143) multi_drop_clause ::= multi_drop_clause drop_table_clause */ + { 355, -2 }, /* (144) drop_table_clause ::= exists_opt full_table_name */ + { 353, 0 }, /* (145) specific_cols_opt ::= */ + { 353, -3 }, /* (146) specific_cols_opt ::= NK_LP col_name_list NK_RP */ + { 340, -1 }, /* (147) full_table_name ::= table_name */ + { 340, -3 }, /* (148) full_table_name ::= db_name NK_DOT table_name */ + { 341, -1 }, /* (149) column_def_list ::= column_def */ + { 341, -3 }, /* (150) column_def_list ::= column_def_list NK_COMMA column_def */ + { 358, -2 }, /* (151) column_def ::= column_name type_name */ + { 358, -4 }, /* (152) column_def ::= column_name type_name COMMENT NK_STRING */ + { 350, -1 }, /* (153) type_name ::= BOOL */ + { 350, -1 }, /* (154) type_name ::= TINYINT */ + { 350, -1 }, /* (155) type_name ::= SMALLINT */ + { 350, -1 }, /* (156) type_name ::= INT */ + { 350, -1 }, /* (157) type_name ::= INTEGER */ + { 350, -1 }, /* (158) type_name ::= BIGINT */ + { 350, -1 }, /* (159) type_name ::= FLOAT */ + { 350, -1 }, /* (160) type_name ::= DOUBLE */ + { 350, -4 }, /* (161) type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ + { 350, -1 }, /* (162) type_name ::= TIMESTAMP */ + { 350, -4 }, /* (163) type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ + { 350, -2 }, /* (164) type_name ::= TINYINT UNSIGNED */ + { 350, -2 }, /* (165) type_name ::= SMALLINT UNSIGNED */ + { 350, -2 }, /* (166) type_name ::= INT UNSIGNED */ + { 350, -2 }, /* (167) type_name ::= BIGINT UNSIGNED */ + { 350, -1 }, /* (168) type_name ::= JSON */ + { 350, -4 }, /* (169) type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ + { 350, -1 }, /* (170) type_name ::= MEDIUMBLOB */ + { 350, -1 }, /* (171) type_name ::= BLOB */ + { 350, -4 }, /* (172) type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ + { 350, -1 }, /* (173) type_name ::= DECIMAL */ + { 350, -4 }, /* (174) type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ + { 350, -6 }, /* (175) type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ + { 342, 0 }, /* (176) tags_def_opt ::= */ + { 342, -1 }, /* (177) tags_def_opt ::= tags_def */ + { 345, -4 }, /* (178) tags_def ::= TAGS NK_LP column_def_list NK_RP */ + { 343, 0 }, /* (179) table_options ::= */ + { 343, -3 }, /* (180) table_options ::= table_options COMMENT NK_STRING */ + { 343, -3 }, /* (181) table_options ::= table_options MAX_DELAY duration_list */ + { 343, -3 }, /* (182) table_options ::= table_options WATERMARK duration_list */ + { 343, -5 }, /* (183) table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ + { 343, -3 }, /* (184) table_options ::= table_options TTL NK_INTEGER */ + { 343, -5 }, /* (185) table_options ::= table_options SMA NK_LP col_name_list NK_RP */ + { 348, -1 }, /* (186) alter_table_options ::= alter_table_option */ + { 348, -2 }, /* (187) alter_table_options ::= alter_table_options alter_table_option */ + { 361, -2 }, /* (188) alter_table_option ::= COMMENT NK_STRING */ + { 361, -2 }, /* (189) alter_table_option ::= TTL NK_INTEGER */ + { 359, -1 }, /* (190) duration_list ::= duration_literal */ + { 359, -3 }, /* (191) duration_list ::= duration_list NK_COMMA duration_literal */ + { 360, -1 }, /* (192) rollup_func_list ::= rollup_func_name */ + { 360, -3 }, /* (193) rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ + { 363, -1 }, /* (194) rollup_func_name ::= function_name */ + { 363, -1 }, /* (195) rollup_func_name ::= FIRST */ + { 363, -1 }, /* (196) rollup_func_name ::= LAST */ + { 356, -1 }, /* (197) col_name_list ::= col_name */ + { 356, -3 }, /* (198) col_name_list ::= col_name_list NK_COMMA col_name */ + { 365, -1 }, /* (199) col_name ::= column_name */ + { 317, -2 }, /* (200) cmd ::= SHOW DNODES */ + { 317, -2 }, /* (201) cmd ::= SHOW USERS */ + { 317, -2 }, /* (202) cmd ::= SHOW DATABASES */ + { 317, -4 }, /* (203) cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ + { 317, -4 }, /* (204) cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ + { 317, -3 }, /* (205) cmd ::= SHOW db_name_cond_opt VGROUPS */ + { 317, -2 }, /* (206) cmd ::= SHOW MNODES */ + { 317, -2 }, /* (207) cmd ::= SHOW MODULES */ + { 317, -2 }, /* (208) cmd ::= SHOW QNODES */ + { 317, -2 }, /* (209) cmd ::= SHOW FUNCTIONS */ + { 317, -5 }, /* (210) cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ + { 317, -2 }, /* (211) cmd ::= SHOW STREAMS */ + { 317, -2 }, /* (212) cmd ::= SHOW ACCOUNTS */ + { 317, -2 }, /* (213) cmd ::= SHOW APPS */ + { 317, -2 }, /* (214) cmd ::= SHOW CONNECTIONS */ + { 317, -2 }, /* (215) cmd ::= SHOW LICENCES */ + { 317, -2 }, /* (216) cmd ::= SHOW GRANTS */ + { 317, -4 }, /* (217) cmd ::= SHOW CREATE DATABASE db_name */ + { 317, -4 }, /* (218) cmd ::= SHOW CREATE TABLE full_table_name */ + { 317, -4 }, /* (219) cmd ::= SHOW CREATE STABLE full_table_name */ + { 317, -2 }, /* (220) cmd ::= SHOW QUERIES */ + { 317, -2 }, /* (221) cmd ::= SHOW SCORES */ + { 317, -2 }, /* (222) cmd ::= SHOW TOPICS */ + { 317, -2 }, /* (223) cmd ::= SHOW VARIABLES */ + { 317, -3 }, /* (224) cmd ::= SHOW LOCAL VARIABLES */ + { 317, -4 }, /* (225) cmd ::= SHOW DNODE NK_INTEGER VARIABLES */ + { 317, -2 }, /* (226) cmd ::= SHOW BNODES */ + { 317, -2 }, /* (227) cmd ::= SHOW SNODES */ + { 317, -2 }, /* (228) cmd ::= SHOW CLUSTER */ + { 317, -2 }, /* (229) cmd ::= SHOW TRANSACTIONS */ + { 317, -4 }, /* (230) cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ + { 317, -2 }, /* (231) cmd ::= SHOW CONSUMERS */ + { 317, -2 }, /* (232) cmd ::= SHOW SUBSCRIPTIONS */ + { 317, -5 }, /* (233) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ + { 317, -6 }, /* (234) cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt */ + { 317, -3 }, /* (235) cmd ::= SHOW VNODES NK_INTEGER */ + { 317, -3 }, /* (236) cmd ::= SHOW VNODES NK_STRING */ + { 366, 0 }, /* (237) db_name_cond_opt ::= */ + { 366, -2 }, /* (238) db_name_cond_opt ::= db_name NK_DOT */ + { 367, 0 }, /* (239) like_pattern_opt ::= */ + { 367, -2 }, /* (240) like_pattern_opt ::= LIKE NK_STRING */ + { 368, -1 }, /* (241) table_name_cond ::= table_name */ + { 369, 0 }, /* (242) from_db_opt ::= */ + { 369, -2 }, /* (243) from_db_opt ::= FROM db_name */ + { 317, -8 }, /* (244) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ + { 317, -4 }, /* (245) cmd ::= DROP INDEX exists_opt full_table_name */ + { 370, -10 }, /* (246) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ + { 370, -12 }, /* (247) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ + { 371, -1 }, /* (248) func_list ::= func */ + { 371, -3 }, /* (249) func_list ::= func_list NK_COMMA func */ + { 374, -4 }, /* (250) func ::= function_name NK_LP expression_list NK_RP */ + { 373, 0 }, /* (251) sma_stream_opt ::= */ + { 373, -3 }, /* (252) sma_stream_opt ::= stream_options WATERMARK duration_literal */ + { 373, -3 }, /* (253) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ + { 317, -6 }, /* (254) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ + { 317, -7 }, /* (255) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ + { 317, -9 }, /* (256) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ + { 317, -7 }, /* (257) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ + { 317, -9 }, /* (258) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ + { 317, -4 }, /* (259) cmd ::= DROP TOPIC exists_opt topic_name */ + { 317, -7 }, /* (260) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ + { 317, -2 }, /* (261) cmd ::= DESC full_table_name */ + { 317, -2 }, /* (262) cmd ::= DESCRIBE full_table_name */ + { 317, -3 }, /* (263) cmd ::= RESET QUERY CACHE */ + { 317, -4 }, /* (264) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ + { 379, 0 }, /* (265) analyze_opt ::= */ + { 379, -1 }, /* (266) analyze_opt ::= ANALYZE */ + { 380, 0 }, /* (267) explain_options ::= */ + { 380, -3 }, /* (268) explain_options ::= explain_options VERBOSE NK_BOOL */ + { 380, -3 }, /* (269) explain_options ::= explain_options RATIO NK_FLOAT */ + { 317, -10 }, /* (270) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ + { 317, -4 }, /* (271) cmd ::= DROP FUNCTION exists_opt function_name */ + { 381, 0 }, /* (272) agg_func_opt ::= */ + { 381, -1 }, /* (273) agg_func_opt ::= AGGREGATE */ + { 382, 0 }, /* (274) bufsize_opt ::= */ + { 382, -2 }, /* (275) bufsize_opt ::= BUFSIZE NK_INTEGER */ + { 317, -11 }, /* (276) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ + { 317, -4 }, /* (277) cmd ::= DROP STREAM exists_opt stream_name */ + { 375, 0 }, /* (278) stream_options ::= */ + { 375, -3 }, /* (279) stream_options ::= stream_options TRIGGER AT_ONCE */ + { 375, -3 }, /* (280) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ + { 375, -4 }, /* (281) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ + { 375, -3 }, /* (282) stream_options ::= stream_options WATERMARK duration_literal */ + { 375, -4 }, /* (283) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ + { 384, 0 }, /* (284) subtable_opt ::= */ + { 384, -4 }, /* (285) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ + { 317, -3 }, /* (286) cmd ::= KILL CONNECTION NK_INTEGER */ + { 317, -3 }, /* (287) cmd ::= KILL QUERY NK_STRING */ + { 317, -3 }, /* (288) cmd ::= KILL TRANSACTION NK_INTEGER */ + { 317, -2 }, /* (289) cmd ::= BALANCE VGROUP */ + { 317, -4 }, /* (290) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + { 317, -4 }, /* (291) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ + { 317, -3 }, /* (292) cmd ::= SPLIT VGROUP NK_INTEGER */ + { 386, -2 }, /* (293) dnode_list ::= DNODE NK_INTEGER */ + { 386, -3 }, /* (294) dnode_list ::= dnode_list DNODE NK_INTEGER */ + { 317, -4 }, /* (295) cmd ::= DELETE FROM full_table_name where_clause_opt */ + { 317, -1 }, /* (296) cmd ::= query_or_subquery */ + { 317, -7 }, /* (297) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ + { 317, -4 }, /* (298) cmd ::= INSERT INTO full_table_name query_or_subquery */ + { 320, -1 }, /* (299) literal ::= NK_INTEGER */ + { 320, -1 }, /* (300) literal ::= NK_FLOAT */ + { 320, -1 }, /* (301) literal ::= NK_STRING */ + { 320, -1 }, /* (302) literal ::= NK_BOOL */ + { 320, -2 }, /* (303) literal ::= TIMESTAMP NK_STRING */ + { 320, -1 }, /* (304) literal ::= duration_literal */ + { 320, -1 }, /* (305) literal ::= NULL */ + { 320, -1 }, /* (306) literal ::= NK_QUESTION */ + { 362, -1 }, /* (307) duration_literal ::= NK_VARIABLE */ + { 388, -1 }, /* (308) signed ::= NK_INTEGER */ + { 388, -2 }, /* (309) signed ::= NK_PLUS NK_INTEGER */ + { 388, -2 }, /* (310) signed ::= NK_MINUS NK_INTEGER */ + { 388, -1 }, /* (311) signed ::= NK_FLOAT */ + { 388, -2 }, /* (312) signed ::= NK_PLUS NK_FLOAT */ + { 388, -2 }, /* (313) signed ::= NK_MINUS NK_FLOAT */ + { 351, -1 }, /* (314) signed_literal ::= signed */ + { 351, -1 }, /* (315) signed_literal ::= NK_STRING */ + { 351, -1 }, /* (316) signed_literal ::= NK_BOOL */ + { 351, -2 }, /* (317) signed_literal ::= TIMESTAMP NK_STRING */ + { 351, -1 }, /* (318) signed_literal ::= duration_literal */ + { 351, -1 }, /* (319) signed_literal ::= NULL */ + { 351, -1 }, /* (320) signed_literal ::= literal_func */ + { 351, -1 }, /* (321) signed_literal ::= NK_QUESTION */ + { 390, -1 }, /* (322) literal_list ::= signed_literal */ + { 390, -3 }, /* (323) literal_list ::= literal_list NK_COMMA signed_literal */ + { 328, -1 }, /* (324) db_name ::= NK_ID */ + { 357, -1 }, /* (325) table_name ::= NK_ID */ + { 349, -1 }, /* (326) column_name ::= NK_ID */ + { 364, -1 }, /* (327) function_name ::= NK_ID */ + { 391, -1 }, /* (328) table_alias ::= NK_ID */ + { 392, -1 }, /* (329) column_alias ::= NK_ID */ + { 322, -1 }, /* (330) user_name ::= NK_ID */ + { 376, -1 }, /* (331) topic_name ::= NK_ID */ + { 383, -1 }, /* (332) stream_name ::= NK_ID */ + { 378, -1 }, /* (333) cgroup_name ::= NK_ID */ + { 393, -1 }, /* (334) expr_or_subquery ::= expression */ + { 393, -1 }, /* (335) expr_or_subquery ::= subquery */ + { 385, -1 }, /* (336) expression ::= literal */ + { 385, -1 }, /* (337) expression ::= pseudo_column */ + { 385, -1 }, /* (338) expression ::= column_reference */ + { 385, -1 }, /* (339) expression ::= function_expression */ + { 385, -1 }, /* (340) expression ::= case_when_expression */ + { 385, -3 }, /* (341) expression ::= NK_LP expression NK_RP */ + { 385, -2 }, /* (342) expression ::= NK_PLUS expr_or_subquery */ + { 385, -2 }, /* (343) expression ::= NK_MINUS expr_or_subquery */ + { 385, -3 }, /* (344) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ + { 385, -3 }, /* (345) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ + { 385, -3 }, /* (346) expression ::= expr_or_subquery NK_STAR expr_or_subquery */ + { 385, -3 }, /* (347) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ + { 385, -3 }, /* (348) expression ::= expr_or_subquery NK_REM expr_or_subquery */ + { 385, -3 }, /* (349) expression ::= column_reference NK_ARROW NK_STRING */ + { 385, -3 }, /* (350) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ + { 385, -3 }, /* (351) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ + { 354, -1 }, /* (352) expression_list ::= expr_or_subquery */ + { 354, -3 }, /* (353) expression_list ::= expression_list NK_COMMA expr_or_subquery */ + { 396, -1 }, /* (354) column_reference ::= column_name */ + { 396, -3 }, /* (355) column_reference ::= table_name NK_DOT column_name */ + { 395, -1 }, /* (356) pseudo_column ::= ROWTS */ + { 395, -1 }, /* (357) pseudo_column ::= TBNAME */ + { 395, -3 }, /* (358) pseudo_column ::= table_name NK_DOT TBNAME */ + { 395, -1 }, /* (359) pseudo_column ::= QSTART */ + { 395, -1 }, /* (360) pseudo_column ::= QEND */ + { 395, -1 }, /* (361) pseudo_column ::= QDURATION */ + { 395, -1 }, /* (362) pseudo_column ::= WSTART */ + { 395, -1 }, /* (363) pseudo_column ::= WEND */ + { 395, -1 }, /* (364) pseudo_column ::= WDURATION */ + { 395, -1 }, /* (365) pseudo_column ::= IROWTS */ + { 395, -1 }, /* (366) pseudo_column ::= QTAGS */ + { 397, -4 }, /* (367) function_expression ::= function_name NK_LP expression_list NK_RP */ + { 397, -4 }, /* (368) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ + { 397, -6 }, /* (369) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ + { 397, -1 }, /* (370) function_expression ::= literal_func */ + { 389, -3 }, /* (371) literal_func ::= noarg_func NK_LP NK_RP */ + { 389, -1 }, /* (372) literal_func ::= NOW */ + { 401, -1 }, /* (373) noarg_func ::= NOW */ + { 401, -1 }, /* (374) noarg_func ::= TODAY */ + { 401, -1 }, /* (375) noarg_func ::= TIMEZONE */ + { 401, -1 }, /* (376) noarg_func ::= DATABASE */ + { 401, -1 }, /* (377) noarg_func ::= CLIENT_VERSION */ + { 401, -1 }, /* (378) noarg_func ::= SERVER_VERSION */ + { 401, -1 }, /* (379) noarg_func ::= SERVER_STATUS */ + { 401, -1 }, /* (380) noarg_func ::= CURRENT_USER */ + { 401, -1 }, /* (381) noarg_func ::= USER */ + { 399, -1 }, /* (382) star_func ::= COUNT */ + { 399, -1 }, /* (383) star_func ::= FIRST */ + { 399, -1 }, /* (384) star_func ::= LAST */ + { 399, -1 }, /* (385) star_func ::= LAST_ROW */ + { 400, -1 }, /* (386) star_func_para_list ::= NK_STAR */ + { 400, -1 }, /* (387) star_func_para_list ::= other_para_list */ + { 402, -1 }, /* (388) other_para_list ::= star_func_para */ + { 402, -3 }, /* (389) other_para_list ::= other_para_list NK_COMMA star_func_para */ + { 403, -1 }, /* (390) star_func_para ::= expr_or_subquery */ + { 403, -3 }, /* (391) star_func_para ::= table_name NK_DOT NK_STAR */ + { 398, -4 }, /* (392) case_when_expression ::= CASE when_then_list case_when_else_opt END */ + { 398, -5 }, /* (393) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ + { 404, -1 }, /* (394) when_then_list ::= when_then_expr */ + { 404, -2 }, /* (395) when_then_list ::= when_then_list when_then_expr */ + { 407, -4 }, /* (396) when_then_expr ::= WHEN common_expression THEN common_expression */ + { 405, 0 }, /* (397) case_when_else_opt ::= */ + { 405, -2 }, /* (398) case_when_else_opt ::= ELSE common_expression */ + { 408, -3 }, /* (399) predicate ::= expr_or_subquery compare_op expr_or_subquery */ + { 408, -5 }, /* (400) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ + { 408, -6 }, /* (401) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ + { 408, -3 }, /* (402) predicate ::= expr_or_subquery IS NULL */ + { 408, -4 }, /* (403) predicate ::= expr_or_subquery IS NOT NULL */ + { 408, -3 }, /* (404) predicate ::= expr_or_subquery in_op in_predicate_value */ + { 409, -1 }, /* (405) compare_op ::= NK_LT */ + { 409, -1 }, /* (406) compare_op ::= NK_GT */ + { 409, -1 }, /* (407) compare_op ::= NK_LE */ + { 409, -1 }, /* (408) compare_op ::= NK_GE */ + { 409, -1 }, /* (409) compare_op ::= NK_NE */ + { 409, -1 }, /* (410) compare_op ::= NK_EQ */ + { 409, -1 }, /* (411) compare_op ::= LIKE */ + { 409, -2 }, /* (412) compare_op ::= NOT LIKE */ + { 409, -1 }, /* (413) compare_op ::= MATCH */ + { 409, -1 }, /* (414) compare_op ::= NMATCH */ + { 409, -1 }, /* (415) compare_op ::= CONTAINS */ + { 410, -1 }, /* (416) in_op ::= IN */ + { 410, -2 }, /* (417) in_op ::= NOT IN */ + { 411, -3 }, /* (418) in_predicate_value ::= NK_LP literal_list NK_RP */ + { 412, -1 }, /* (419) boolean_value_expression ::= boolean_primary */ + { 412, -2 }, /* (420) boolean_value_expression ::= NOT boolean_primary */ + { 412, -3 }, /* (421) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 412, -3 }, /* (422) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 413, -1 }, /* (423) boolean_primary ::= predicate */ + { 413, -3 }, /* (424) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 406, -1 }, /* (425) common_expression ::= expr_or_subquery */ + { 406, -1 }, /* (426) common_expression ::= boolean_value_expression */ + { 414, 0 }, /* (427) from_clause_opt ::= */ + { 414, -2 }, /* (428) from_clause_opt ::= FROM table_reference_list */ + { 415, -1 }, /* (429) table_reference_list ::= table_reference */ + { 415, -3 }, /* (430) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 416, -1 }, /* (431) table_reference ::= table_primary */ + { 416, -1 }, /* (432) table_reference ::= joined_table */ + { 417, -2 }, /* (433) table_primary ::= table_name alias_opt */ + { 417, -4 }, /* (434) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 417, -2 }, /* (435) table_primary ::= subquery alias_opt */ + { 417, -1 }, /* (436) table_primary ::= parenthesized_joined_table */ + { 419, 0 }, /* (437) alias_opt ::= */ + { 419, -1 }, /* (438) alias_opt ::= table_alias */ + { 419, -2 }, /* (439) alias_opt ::= AS table_alias */ + { 420, -3 }, /* (440) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 420, -3 }, /* (441) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 418, -6 }, /* (442) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 421, 0 }, /* (443) join_type ::= */ + { 421, -1 }, /* (444) join_type ::= INNER */ + { 423, -12 }, /* (445) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ + { 424, 0 }, /* (446) set_quantifier_opt ::= */ + { 424, -1 }, /* (447) set_quantifier_opt ::= DISTINCT */ + { 424, -1 }, /* (448) set_quantifier_opt ::= ALL */ + { 425, -1 }, /* (449) select_list ::= select_item */ + { 425, -3 }, /* (450) select_list ::= select_list NK_COMMA select_item */ + { 433, -1 }, /* (451) select_item ::= NK_STAR */ + { 433, -1 }, /* (452) select_item ::= common_expression */ + { 433, -2 }, /* (453) select_item ::= common_expression column_alias */ + { 433, -3 }, /* (454) select_item ::= common_expression AS column_alias */ + { 433, -3 }, /* (455) select_item ::= table_name NK_DOT NK_STAR */ + { 387, 0 }, /* (456) where_clause_opt ::= */ + { 387, -2 }, /* (457) where_clause_opt ::= WHERE search_condition */ + { 426, 0 }, /* (458) partition_by_clause_opt ::= */ + { 426, -3 }, /* (459) partition_by_clause_opt ::= PARTITION BY partition_list */ + { 434, -1 }, /* (460) partition_list ::= partition_item */ + { 434, -3 }, /* (461) partition_list ::= partition_list NK_COMMA partition_item */ + { 435, -1 }, /* (462) partition_item ::= expr_or_subquery */ + { 435, -2 }, /* (463) partition_item ::= expr_or_subquery column_alias */ + { 435, -3 }, /* (464) partition_item ::= expr_or_subquery AS column_alias */ + { 430, 0 }, /* (465) twindow_clause_opt ::= */ + { 430, -6 }, /* (466) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ + { 430, -4 }, /* (467) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ + { 430, -6 }, /* (468) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 430, -8 }, /* (469) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 372, 0 }, /* (470) sliding_opt ::= */ + { 372, -4 }, /* (471) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 429, 0 }, /* (472) fill_opt ::= */ + { 429, -4 }, /* (473) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 429, -6 }, /* (474) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 436, -1 }, /* (475) fill_mode ::= NONE */ + { 436, -1 }, /* (476) fill_mode ::= PREV */ + { 436, -1 }, /* (477) fill_mode ::= NULL */ + { 436, -1 }, /* (478) fill_mode ::= LINEAR */ + { 436, -1 }, /* (479) fill_mode ::= NEXT */ + { 431, 0 }, /* (480) group_by_clause_opt ::= */ + { 431, -3 }, /* (481) group_by_clause_opt ::= GROUP BY group_by_list */ + { 437, -1 }, /* (482) group_by_list ::= expr_or_subquery */ + { 437, -3 }, /* (483) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ + { 432, 0 }, /* (484) having_clause_opt ::= */ + { 432, -2 }, /* (485) having_clause_opt ::= HAVING search_condition */ + { 427, 0 }, /* (486) range_opt ::= */ + { 427, -6 }, /* (487) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ + { 428, 0 }, /* (488) every_opt ::= */ + { 428, -4 }, /* (489) every_opt ::= EVERY NK_LP duration_literal NK_RP */ + { 438, -4 }, /* (490) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 439, -1 }, /* (491) query_simple ::= query_specification */ + { 439, -1 }, /* (492) query_simple ::= union_query_expression */ + { 443, -4 }, /* (493) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ + { 443, -3 }, /* (494) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ + { 444, -1 }, /* (495) query_simple_or_subquery ::= query_simple */ + { 444, -1 }, /* (496) query_simple_or_subquery ::= subquery */ + { 377, -1 }, /* (497) query_or_subquery ::= query_expression */ + { 377, -1 }, /* (498) query_or_subquery ::= subquery */ + { 440, 0 }, /* (499) order_by_clause_opt ::= */ + { 440, -3 }, /* (500) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 441, 0 }, /* (501) slimit_clause_opt ::= */ + { 441, -2 }, /* (502) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 441, -4 }, /* (503) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 441, -4 }, /* (504) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 442, 0 }, /* (505) limit_clause_opt ::= */ + { 442, -2 }, /* (506) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 442, -4 }, /* (507) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 442, -4 }, /* (508) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 394, -3 }, /* (509) subquery ::= NK_LP query_expression NK_RP */ + { 394, -3 }, /* (510) subquery ::= NK_LP subquery NK_RP */ + { 422, -1 }, /* (511) search_condition ::= common_expression */ + { 445, -1 }, /* (512) sort_specification_list ::= sort_specification */ + { 445, -3 }, /* (513) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 446, -3 }, /* (514) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ + { 447, 0 }, /* (515) ordering_specification_opt ::= */ + { 447, -1 }, /* (516) ordering_specification_opt ::= ASC */ + { 447, -1 }, /* (517) ordering_specification_opt ::= DESC */ + { 448, 0 }, /* (518) null_ordering_opt ::= */ + { 448, -2 }, /* (519) null_ordering_opt ::= NULLS FIRST */ + { 448, -2 }, /* (520) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -3619,11 +3618,11 @@ static YYACTIONTYPE yy_reduce( YYMINORTYPE yylhsminor; case 0: /* cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } - yy_destructor(yypParser,317,&yymsp[0].minor); + yy_destructor(yypParser,318,&yymsp[0].minor); break; case 1: /* cmd ::= ALTER ACCOUNT NK_ID alter_account_options */ { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } - yy_destructor(yypParser,318,&yymsp[0].minor); + yy_destructor(yypParser,319,&yymsp[0].minor); break; case 2: /* account_options ::= */ { } @@ -3637,20 +3636,20 @@ static YYACTIONTYPE yy_reduce( case 9: /* account_options ::= account_options USERS literal */ yytestcase(yyruleno==9); case 10: /* account_options ::= account_options CONNS literal */ yytestcase(yyruleno==10); case 11: /* account_options ::= account_options STATE literal */ yytestcase(yyruleno==11); -{ yy_destructor(yypParser,317,&yymsp[-2].minor); +{ yy_destructor(yypParser,318,&yymsp[-2].minor); { } - yy_destructor(yypParser,319,&yymsp[0].minor); + yy_destructor(yypParser,320,&yymsp[0].minor); } break; case 12: /* alter_account_options ::= alter_account_option */ -{ yy_destructor(yypParser,320,&yymsp[0].minor); +{ yy_destructor(yypParser,321,&yymsp[0].minor); { } } break; case 13: /* alter_account_options ::= alter_account_options alter_account_option */ -{ yy_destructor(yypParser,318,&yymsp[-1].minor); +{ yy_destructor(yypParser,319,&yymsp[-1].minor); { } - yy_destructor(yypParser,320,&yymsp[0].minor); + yy_destructor(yypParser,321,&yymsp[0].minor); } break; case 14: /* alter_account_option ::= PASS literal */ @@ -3664,72 +3663,72 @@ static YYACTIONTYPE yy_reduce( case 22: /* alter_account_option ::= CONNS literal */ yytestcase(yyruleno==22); case 23: /* alter_account_option ::= STATE literal */ yytestcase(yyruleno==23); { } - yy_destructor(yypParser,319,&yymsp[0].minor); + yy_destructor(yypParser,320,&yymsp[0].minor); break; case 24: /* cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ -{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy673, &yymsp[-1].minor.yy0, yymsp[0].minor.yy439); } +{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy181, &yymsp[-1].minor.yy0, yymsp[0].minor.yy293); } break; case 25: /* cmd ::= ALTER USER user_name PASS NK_STRING */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy673, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy181, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } break; case 26: /* cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy673, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy181, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } break; case 27: /* cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy673, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy181, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } break; case 28: /* cmd ::= DROP USER user_name */ -{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy673); } +{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy181); } break; case 29: /* sysinfo_opt ::= */ -{ yymsp[1].minor.yy439 = 1; } +{ yymsp[1].minor.yy293 = 1; } break; case 30: /* sysinfo_opt ::= SYSINFO NK_INTEGER */ -{ yymsp[-1].minor.yy439 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } +{ yymsp[-1].minor.yy293 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } break; case 31: /* cmd ::= GRANT privileges ON priv_level TO user_name */ -{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy221, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy673); } +{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy831, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181); } break; case 32: /* cmd ::= REVOKE privileges ON priv_level FROM user_name */ -{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy221, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy673); } +{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy831, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181); } break; case 33: /* privileges ::= ALL */ -{ yymsp[0].minor.yy221 = PRIVILEGE_TYPE_ALL; } +{ yymsp[0].minor.yy831 = PRIVILEGE_TYPE_ALL; } break; case 34: /* privileges ::= priv_type_list */ case 35: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==35); -{ yylhsminor.yy221 = yymsp[0].minor.yy221; } - yymsp[0].minor.yy221 = yylhsminor.yy221; +{ yylhsminor.yy831 = yymsp[0].minor.yy831; } + yymsp[0].minor.yy831 = yylhsminor.yy831; break; case 36: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */ -{ yylhsminor.yy221 = yymsp[-2].minor.yy221 | yymsp[0].minor.yy221; } - yymsp[-2].minor.yy221 = yylhsminor.yy221; +{ yylhsminor.yy831 = yymsp[-2].minor.yy831 | yymsp[0].minor.yy831; } + yymsp[-2].minor.yy831 = yylhsminor.yy831; break; case 37: /* priv_type ::= READ */ -{ yymsp[0].minor.yy221 = PRIVILEGE_TYPE_READ; } +{ yymsp[0].minor.yy831 = PRIVILEGE_TYPE_READ; } break; case 38: /* priv_type ::= WRITE */ -{ yymsp[0].minor.yy221 = PRIVILEGE_TYPE_WRITE; } +{ yymsp[0].minor.yy831 = PRIVILEGE_TYPE_WRITE; } break; case 39: /* priv_level ::= NK_STAR NK_DOT NK_STAR */ -{ yylhsminor.yy673 = yymsp[-2].minor.yy0; } - yymsp[-2].minor.yy673 = yylhsminor.yy673; +{ yylhsminor.yy181 = yymsp[-2].minor.yy0; } + yymsp[-2].minor.yy181 = yylhsminor.yy181; break; case 40: /* priv_level ::= db_name NK_DOT NK_STAR */ -{ yylhsminor.yy673 = yymsp[-2].minor.yy673; } - yymsp[-2].minor.yy673 = yylhsminor.yy673; +{ yylhsminor.yy181 = yymsp[-2].minor.yy181; } + yymsp[-2].minor.yy181 = yylhsminor.yy181; break; case 41: /* cmd ::= CREATE DNODE dnode_endpoint */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy673, NULL); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy181, NULL); } break; case 42: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy0); } break; case 43: /* cmd ::= DROP DNODE NK_INTEGER */ { pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy0); } break; case 44: /* cmd ::= DROP DNODE dnode_endpoint */ -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy673); } +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy181); } break; case 45: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); } @@ -3746,31 +3745,31 @@ static YYACTIONTYPE yy_reduce( case 49: /* dnode_endpoint ::= NK_STRING */ case 50: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==50); case 51: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==51); - case 323: /* db_name ::= NK_ID */ yytestcase(yyruleno==323); - case 324: /* table_name ::= NK_ID */ yytestcase(yyruleno==324); - case 325: /* column_name ::= NK_ID */ yytestcase(yyruleno==325); - case 326: /* function_name ::= NK_ID */ yytestcase(yyruleno==326); - case 327: /* table_alias ::= NK_ID */ yytestcase(yyruleno==327); - case 328: /* column_alias ::= NK_ID */ yytestcase(yyruleno==328); - case 329: /* user_name ::= NK_ID */ yytestcase(yyruleno==329); - case 330: /* topic_name ::= NK_ID */ yytestcase(yyruleno==330); - case 331: /* stream_name ::= NK_ID */ yytestcase(yyruleno==331); - case 332: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==332); - case 371: /* noarg_func ::= NOW */ yytestcase(yyruleno==371); - case 372: /* noarg_func ::= TODAY */ yytestcase(yyruleno==372); - case 373: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==373); - case 374: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==374); - case 375: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==375); - case 376: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==376); - case 377: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==377); - case 378: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==378); - case 379: /* noarg_func ::= USER */ yytestcase(yyruleno==379); - case 380: /* star_func ::= COUNT */ yytestcase(yyruleno==380); - case 381: /* star_func ::= FIRST */ yytestcase(yyruleno==381); - case 382: /* star_func ::= LAST */ yytestcase(yyruleno==382); - case 383: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==383); -{ yylhsminor.yy673 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy673 = yylhsminor.yy673; + case 324: /* db_name ::= NK_ID */ yytestcase(yyruleno==324); + case 325: /* table_name ::= NK_ID */ yytestcase(yyruleno==325); + case 326: /* column_name ::= NK_ID */ yytestcase(yyruleno==326); + case 327: /* function_name ::= NK_ID */ yytestcase(yyruleno==327); + case 328: /* table_alias ::= NK_ID */ yytestcase(yyruleno==328); + case 329: /* column_alias ::= NK_ID */ yytestcase(yyruleno==329); + case 330: /* user_name ::= NK_ID */ yytestcase(yyruleno==330); + case 331: /* topic_name ::= NK_ID */ yytestcase(yyruleno==331); + case 332: /* stream_name ::= NK_ID */ yytestcase(yyruleno==332); + case 333: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==333); + case 373: /* noarg_func ::= NOW */ yytestcase(yyruleno==373); + case 374: /* noarg_func ::= TODAY */ yytestcase(yyruleno==374); + case 375: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==375); + case 376: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==376); + case 377: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==377); + case 378: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==378); + case 379: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==379); + case 380: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==380); + case 381: /* noarg_func ::= USER */ yytestcase(yyruleno==381); + case 382: /* star_func ::= COUNT */ yytestcase(yyruleno==382); + case 383: /* star_func ::= FIRST */ yytestcase(yyruleno==383); + case 384: /* star_func ::= LAST */ yytestcase(yyruleno==384); + case 385: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==385); +{ yylhsminor.yy181 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy181 = yylhsminor.yy181; break; case 52: /* cmd ::= ALTER LOCAL NK_STRING */ { pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); } @@ -3803,208 +3802,208 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_MNODE_STMT, &yymsp[0].minor.yy0); } break; case 62: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ -{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy89, &yymsp[-1].minor.yy673, yymsp[0].minor.yy616); } +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy39, &yymsp[-1].minor.yy181, yymsp[0].minor.yy778); } break; case 63: /* cmd ::= DROP DATABASE exists_opt db_name */ -{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy89, &yymsp[0].minor.yy673); } +{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy39, &yymsp[0].minor.yy181); } break; case 64: /* cmd ::= USE db_name */ -{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy673); } +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy181); } break; case 65: /* cmd ::= ALTER DATABASE db_name alter_db_options */ -{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy673, yymsp[0].minor.yy616); } +{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy181, yymsp[0].minor.yy778); } break; case 66: /* cmd ::= FLUSH DATABASE db_name */ -{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy673); } +{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy181); } break; case 67: /* cmd ::= TRIM DATABASE db_name speed_opt */ -{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy673, yymsp[0].minor.yy452); } +{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy181, yymsp[0].minor.yy276); } break; case 68: /* not_exists_opt ::= IF NOT EXISTS */ -{ yymsp[-2].minor.yy89 = true; } +{ yymsp[-2].minor.yy39 = true; } break; case 69: /* not_exists_opt ::= */ case 71: /* exists_opt ::= */ yytestcase(yyruleno==71); - case 264: /* analyze_opt ::= */ yytestcase(yyruleno==264); - case 271: /* agg_func_opt ::= */ yytestcase(yyruleno==271); - case 444: /* set_quantifier_opt ::= */ yytestcase(yyruleno==444); -{ yymsp[1].minor.yy89 = false; } + case 265: /* analyze_opt ::= */ yytestcase(yyruleno==265); + case 272: /* agg_func_opt ::= */ yytestcase(yyruleno==272); + case 446: /* set_quantifier_opt ::= */ yytestcase(yyruleno==446); +{ yymsp[1].minor.yy39 = false; } break; case 70: /* exists_opt ::= IF EXISTS */ -{ yymsp[-1].minor.yy89 = true; } +{ yymsp[-1].minor.yy39 = true; } break; case 72: /* db_options ::= */ -{ yymsp[1].minor.yy616 = createDefaultDatabaseOptions(pCxt); } +{ yymsp[1].minor.yy778 = createDefaultDatabaseOptions(pCxt); } break; case 73: /* db_options ::= db_options BUFFER NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 74: /* db_options ::= db_options CACHEMODEL NK_STRING */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 75: /* db_options ::= db_options CACHESIZE NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 76: /* db_options ::= db_options COMP NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_COMP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 77: /* db_options ::= db_options DURATION NK_INTEGER */ case 78: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==78); -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 79: /* db_options ::= db_options MAXROWS NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 80: /* db_options ::= db_options MINROWS NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 81: /* db_options ::= db_options KEEP integer_list */ case 82: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==82); -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_KEEP, yymsp[0].minor.yy152); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_KEEP, yymsp[0].minor.yy282); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 83: /* db_options ::= db_options PAGES NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 84: /* db_options ::= db_options PAGESIZE NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 85: /* db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 86: /* db_options ::= db_options PRECISION NK_STRING */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 87: /* db_options ::= db_options REPLICA NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 88: /* db_options ::= db_options STRICT NK_STRING */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 89: /* db_options ::= db_options VGROUPS NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 90: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 91: /* db_options ::= db_options RETENTIONS retention_list */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_RETENTIONS, yymsp[0].minor.yy152); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_RETENTIONS, yymsp[0].minor.yy282); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 92: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 93: /* db_options ::= db_options WAL_LEVEL NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_WAL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 94: /* db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 95: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 96: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-3].minor.yy616, DB_OPTION_WAL_RETENTION_PERIOD, &t); + yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-3].minor.yy778, DB_OPTION_WAL_RETENTION_PERIOD, &t); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; case 97: /* db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 98: /* db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-3].minor.yy616, DB_OPTION_WAL_RETENTION_SIZE, &t); + yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-3].minor.yy778, DB_OPTION_WAL_RETENTION_SIZE, &t); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; case 99: /* db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 100: /* db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 101: /* db_options ::= db_options STT_TRIGGER NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 102: /* db_options ::= db_options TABLE_PREFIX NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_TABLE_PREFIX, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_TABLE_PREFIX, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 103: /* db_options ::= db_options TABLE_SUFFIX NK_INTEGER */ -{ yylhsminor.yy616 = setDatabaseOption(pCxt, yymsp[-2].minor.yy616, DB_OPTION_TABLE_SUFFIX, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setDatabaseOption(pCxt, yymsp[-2].minor.yy778, DB_OPTION_TABLE_SUFFIX, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 104: /* alter_db_options ::= alter_db_option */ -{ yylhsminor.yy616 = createAlterDatabaseOptions(pCxt); yylhsminor.yy616 = setAlterDatabaseOption(pCxt, yylhsminor.yy616, &yymsp[0].minor.yy669); } - yymsp[0].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterDatabaseOptions(pCxt); yylhsminor.yy778 = setAlterDatabaseOption(pCxt, yylhsminor.yy778, &yymsp[0].minor.yy645); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; case 105: /* alter_db_options ::= alter_db_options alter_db_option */ -{ yylhsminor.yy616 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy616, &yymsp[0].minor.yy669); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy778, &yymsp[0].minor.yy645); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; case 106: /* alter_db_option ::= CACHEMODEL NK_STRING */ -{ yymsp[-1].minor.yy669.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy669.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy645.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; case 107: /* alter_db_option ::= CACHESIZE NK_INTEGER */ -{ yymsp[-1].minor.yy669.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy669.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy645.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; case 108: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ -{ yymsp[-1].minor.yy669.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy669.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy645.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; case 109: /* alter_db_option ::= KEEP integer_list */ case 110: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==110); -{ yymsp[-1].minor.yy669.type = DB_OPTION_KEEP; yymsp[-1].minor.yy669.pList = yymsp[0].minor.yy152; } +{ yymsp[-1].minor.yy645.type = DB_OPTION_KEEP; yymsp[-1].minor.yy645.pList = yymsp[0].minor.yy282; } break; case 111: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */ -{ yymsp[-1].minor.yy669.type = DB_OPTION_WAL; yymsp[-1].minor.yy669.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy645.type = DB_OPTION_WAL; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; case 112: /* alter_db_option ::= STT_TRIGGER NK_INTEGER */ -{ yymsp[-1].minor.yy669.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy669.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy645.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; case 113: /* integer_list ::= NK_INTEGER */ -{ yylhsminor.yy152 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy152 = yylhsminor.yy152; +{ yylhsminor.yy282 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy282 = yylhsminor.yy282; break; case 114: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ - case 293: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==293); -{ yylhsminor.yy152 = addNodeToList(pCxt, yymsp[-2].minor.yy152, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy152 = yylhsminor.yy152; + case 294: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==294); +{ yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy282 = yylhsminor.yy282; break; case 115: /* variable_list ::= NK_VARIABLE */ -{ yylhsminor.yy152 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy152 = yylhsminor.yy152; +{ yylhsminor.yy282 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy282 = yylhsminor.yy282; break; case 116: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ -{ yylhsminor.yy152 = addNodeToList(pCxt, yymsp[-2].minor.yy152, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy152 = yylhsminor.yy152; +{ yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy282 = yylhsminor.yy282; break; case 117: /* retention_list ::= retention */ case 139: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==139); @@ -4012,279 +4011,279 @@ static YYACTIONTYPE yy_reduce( case 149: /* column_def_list ::= column_def */ yytestcase(yyruleno==149); case 192: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==192); case 197: /* col_name_list ::= col_name */ yytestcase(yyruleno==197); - case 247: /* func_list ::= func */ yytestcase(yyruleno==247); - case 321: /* literal_list ::= signed_literal */ yytestcase(yyruleno==321); - case 386: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==386); - case 392: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==392); - case 447: /* select_list ::= select_item */ yytestcase(yyruleno==447); - case 458: /* partition_list ::= partition_item */ yytestcase(yyruleno==458); - case 510: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==510); -{ yylhsminor.yy152 = createNodeList(pCxt, yymsp[0].minor.yy616); } - yymsp[0].minor.yy152 = yylhsminor.yy152; + case 248: /* func_list ::= func */ yytestcase(yyruleno==248); + case 322: /* literal_list ::= signed_literal */ yytestcase(yyruleno==322); + case 388: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==388); + case 394: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==394); + case 449: /* select_list ::= select_item */ yytestcase(yyruleno==449); + case 460: /* partition_list ::= partition_item */ yytestcase(yyruleno==460); + case 512: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==512); +{ yylhsminor.yy282 = createNodeList(pCxt, yymsp[0].minor.yy778); } + yymsp[0].minor.yy282 = yylhsminor.yy282; break; case 118: /* retention_list ::= retention_list NK_COMMA retention */ case 150: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==150); case 193: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==193); case 198: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==198); - case 248: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==248); - case 322: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==322); - case 387: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==387); - case 448: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==448); - case 459: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==459); - case 511: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==511); -{ yylhsminor.yy152 = addNodeToList(pCxt, yymsp[-2].minor.yy152, yymsp[0].minor.yy616); } - yymsp[-2].minor.yy152 = yylhsminor.yy152; + case 249: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==249); + case 323: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==323); + case 389: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==389); + case 450: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==450); + case 461: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==461); + case 513: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==513); +{ yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, yymsp[0].minor.yy778); } + yymsp[-2].minor.yy282 = yylhsminor.yy282; break; case 119: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ -{ yylhsminor.yy616 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 120: /* speed_opt ::= */ - case 273: /* bufsize_opt ::= */ yytestcase(yyruleno==273); -{ yymsp[1].minor.yy452 = 0; } + case 274: /* bufsize_opt ::= */ yytestcase(yyruleno==274); +{ yymsp[1].minor.yy276 = 0; } break; case 121: /* speed_opt ::= MAX_SPEED NK_INTEGER */ - case 274: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==274); -{ yymsp[-1].minor.yy452 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } + case 275: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==275); +{ yymsp[-1].minor.yy276 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } break; case 122: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ case 124: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==124); -{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy89, yymsp[-5].minor.yy616, yymsp[-3].minor.yy152, yymsp[-1].minor.yy152, yymsp[0].minor.yy616); } +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy39, yymsp[-5].minor.yy778, yymsp[-3].minor.yy282, yymsp[-1].minor.yy282, yymsp[0].minor.yy778); } break; case 123: /* cmd ::= CREATE TABLE multi_create_clause */ -{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy152); } +{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy282); } break; case 125: /* cmd ::= DROP TABLE multi_drop_clause */ -{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy152); } +{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy282); } break; case 126: /* cmd ::= DROP STABLE exists_opt full_table_name */ -{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy89, yymsp[0].minor.yy616); } +{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy39, yymsp[0].minor.yy778); } break; case 127: /* cmd ::= ALTER TABLE alter_table_clause */ - case 295: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==295); -{ pCxt->pRootNode = yymsp[0].minor.yy616; } + case 296: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==296); +{ pCxt->pRootNode = yymsp[0].minor.yy778; } break; case 128: /* cmd ::= ALTER STABLE alter_table_clause */ -{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy616); } +{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy778); } break; case 129: /* alter_table_clause ::= full_table_name alter_table_options */ -{ yylhsminor.yy616 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy616, yymsp[0].minor.yy616); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; case 130: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ -{ yylhsminor.yy616 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy616, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy673, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380); } + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; case 131: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ -{ yylhsminor.yy616 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy616, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy673); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy778, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy181); } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; case 132: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ -{ yylhsminor.yy616 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy616, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy673, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380); } + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; case 133: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ -{ yylhsminor.yy616 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy616, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy673, &yymsp[0].minor.yy673); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy181, &yymsp[0].minor.yy181); } + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; case 134: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ -{ yylhsminor.yy616 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy616, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy673, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380); } + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; case 135: /* alter_table_clause ::= full_table_name DROP TAG column_name */ -{ yylhsminor.yy616 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy616, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy673); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy778, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy181); } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; case 136: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ -{ yylhsminor.yy616 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy616, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy673, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380); } + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; case 137: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ -{ yylhsminor.yy616 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy616, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy673, &yymsp[0].minor.yy673); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy778, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy181, &yymsp[0].minor.yy181); } + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; case 138: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ -{ yylhsminor.yy616 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy616, &yymsp[-2].minor.yy673, yymsp[0].minor.yy616); } - yymsp[-5].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy778, &yymsp[-2].minor.yy181, yymsp[0].minor.yy778); } + yymsp[-5].minor.yy778 = yylhsminor.yy778; break; case 140: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ case 143: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==143); - case 393: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==393); -{ yylhsminor.yy152 = addNodeToList(pCxt, yymsp[-1].minor.yy152, yymsp[0].minor.yy616); } - yymsp[-1].minor.yy152 = yylhsminor.yy152; + case 395: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==395); +{ yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-1].minor.yy282, yymsp[0].minor.yy778); } + yymsp[-1].minor.yy282 = yylhsminor.yy282; break; case 141: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ -{ yylhsminor.yy616 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy89, yymsp[-8].minor.yy616, yymsp[-6].minor.yy616, yymsp[-5].minor.yy152, yymsp[-2].minor.yy152, yymsp[0].minor.yy616); } - yymsp[-9].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy39, yymsp[-8].minor.yy778, yymsp[-6].minor.yy778, yymsp[-5].minor.yy282, yymsp[-2].minor.yy282, yymsp[0].minor.yy778); } + yymsp[-9].minor.yy778 = yylhsminor.yy778; break; case 144: /* drop_table_clause ::= exists_opt full_table_name */ -{ yylhsminor.yy616 = createDropTableClause(pCxt, yymsp[-1].minor.yy89, yymsp[0].minor.yy616); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createDropTableClause(pCxt, yymsp[-1].minor.yy39, yymsp[0].minor.yy778); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; case 145: /* specific_cols_opt ::= */ case 176: /* tags_def_opt ::= */ yytestcase(yyruleno==176); - case 456: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==456); - case 478: /* group_by_clause_opt ::= */ yytestcase(yyruleno==478); - case 497: /* order_by_clause_opt ::= */ yytestcase(yyruleno==497); -{ yymsp[1].minor.yy152 = NULL; } + case 458: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==458); + case 480: /* group_by_clause_opt ::= */ yytestcase(yyruleno==480); + case 499: /* order_by_clause_opt ::= */ yytestcase(yyruleno==499); +{ yymsp[1].minor.yy282 = NULL; } break; case 146: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ -{ yymsp[-2].minor.yy152 = yymsp[-1].minor.yy152; } +{ yymsp[-2].minor.yy282 = yymsp[-1].minor.yy282; } break; case 147: /* full_table_name ::= table_name */ -{ yylhsminor.yy616 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy673, NULL); } - yymsp[0].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy181, NULL); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; case 148: /* full_table_name ::= db_name NK_DOT table_name */ -{ yylhsminor.yy616 = createRealTableNode(pCxt, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy673, NULL); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createRealTableNode(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181, NULL); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 151: /* column_def ::= column_name type_name */ -{ yylhsminor.yy616 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy673, yymsp[0].minor.yy784, NULL); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy181, yymsp[0].minor.yy380, NULL); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; case 152: /* column_def ::= column_name type_name COMMENT NK_STRING */ -{ yylhsminor.yy616 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy673, yymsp[-2].minor.yy784, &yymsp[0].minor.yy0); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy181, yymsp[-2].minor.yy380, &yymsp[0].minor.yy0); } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; case 153: /* type_name ::= BOOL */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_BOOL); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_BOOL); } break; case 154: /* type_name ::= TINYINT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_TINYINT); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; case 155: /* type_name ::= SMALLINT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_SMALLINT); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; case 156: /* type_name ::= INT */ case 157: /* type_name ::= INTEGER */ yytestcase(yyruleno==157); -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_INT); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_INT); } break; case 158: /* type_name ::= BIGINT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_BIGINT); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; case 159: /* type_name ::= FLOAT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_FLOAT); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; case 160: /* type_name ::= DOUBLE */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_DOUBLE); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_DOUBLE); } break; case 161: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy380 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } break; case 162: /* type_name ::= TIMESTAMP */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } break; case 163: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy380 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } break; case 164: /* type_name ::= TINYINT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_UTINYINT); } +{ yymsp[-1].minor.yy380 = createDataType(TSDB_DATA_TYPE_UTINYINT); } break; case 165: /* type_name ::= SMALLINT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_USMALLINT); } +{ yymsp[-1].minor.yy380 = createDataType(TSDB_DATA_TYPE_USMALLINT); } break; case 166: /* type_name ::= INT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_UINT); } +{ yymsp[-1].minor.yy380 = createDataType(TSDB_DATA_TYPE_UINT); } break; case 167: /* type_name ::= BIGINT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_UBIGINT); } +{ yymsp[-1].minor.yy380 = createDataType(TSDB_DATA_TYPE_UBIGINT); } break; case 168: /* type_name ::= JSON */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_JSON); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_JSON); } break; case 169: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy380 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } break; case 170: /* type_name ::= MEDIUMBLOB */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } break; case 171: /* type_name ::= BLOB */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_BLOB); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_BLOB); } break; case 172: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy380 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } break; case 173: /* type_name ::= DECIMAL */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_DECIMAL); } +{ yymsp[0].minor.yy380 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; case 174: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createDataType(TSDB_DATA_TYPE_DECIMAL); } +{ yymsp[-3].minor.yy380 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; case 175: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ -{ yymsp[-5].minor.yy784 = createDataType(TSDB_DATA_TYPE_DECIMAL); } +{ yymsp[-5].minor.yy380 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; case 177: /* tags_def_opt ::= tags_def */ - case 385: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==385); -{ yylhsminor.yy152 = yymsp[0].minor.yy152; } - yymsp[0].minor.yy152 = yylhsminor.yy152; + case 387: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==387); +{ yylhsminor.yy282 = yymsp[0].minor.yy282; } + yymsp[0].minor.yy282 = yylhsminor.yy282; break; case 178: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ -{ yymsp[-3].minor.yy152 = yymsp[-1].minor.yy152; } +{ yymsp[-3].minor.yy282 = yymsp[-1].minor.yy282; } break; case 179: /* table_options ::= */ -{ yymsp[1].minor.yy616 = createDefaultTableOptions(pCxt); } +{ yymsp[1].minor.yy778 = createDefaultTableOptions(pCxt); } break; case 180: /* table_options ::= table_options COMMENT NK_STRING */ -{ yylhsminor.yy616 = setTableOption(pCxt, yymsp[-2].minor.yy616, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setTableOption(pCxt, yymsp[-2].minor.yy778, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 181: /* table_options ::= table_options MAX_DELAY duration_list */ -{ yylhsminor.yy616 = setTableOption(pCxt, yymsp[-2].minor.yy616, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy152); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setTableOption(pCxt, yymsp[-2].minor.yy778, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy282); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 182: /* table_options ::= table_options WATERMARK duration_list */ -{ yylhsminor.yy616 = setTableOption(pCxt, yymsp[-2].minor.yy616, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy152); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setTableOption(pCxt, yymsp[-2].minor.yy778, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy282); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 183: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ -{ yylhsminor.yy616 = setTableOption(pCxt, yymsp[-4].minor.yy616, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy152); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setTableOption(pCxt, yymsp[-4].minor.yy778, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy282); } + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; case 184: /* table_options ::= table_options TTL NK_INTEGER */ -{ yylhsminor.yy616 = setTableOption(pCxt, yymsp[-2].minor.yy616, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setTableOption(pCxt, yymsp[-2].minor.yy778, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; case 185: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ -{ yylhsminor.yy616 = setTableOption(pCxt, yymsp[-4].minor.yy616, TABLE_OPTION_SMA, yymsp[-1].minor.yy152); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setTableOption(pCxt, yymsp[-4].minor.yy778, TABLE_OPTION_SMA, yymsp[-1].minor.yy282); } + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; case 186: /* alter_table_options ::= alter_table_option */ -{ yylhsminor.yy616 = createAlterTableOptions(pCxt); yylhsminor.yy616 = setTableOption(pCxt, yylhsminor.yy616, yymsp[0].minor.yy669.type, &yymsp[0].minor.yy669.val); } - yymsp[0].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createAlterTableOptions(pCxt); yylhsminor.yy778 = setTableOption(pCxt, yylhsminor.yy778, yymsp[0].minor.yy645.type, &yymsp[0].minor.yy645.val); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; case 187: /* alter_table_options ::= alter_table_options alter_table_option */ -{ yylhsminor.yy616 = setTableOption(pCxt, yymsp[-1].minor.yy616, yymsp[0].minor.yy669.type, &yymsp[0].minor.yy669.val); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = setTableOption(pCxt, yymsp[-1].minor.yy778, yymsp[0].minor.yy645.type, &yymsp[0].minor.yy645.val); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; case 188: /* alter_table_option ::= COMMENT NK_STRING */ -{ yymsp[-1].minor.yy669.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy669.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy645.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; case 189: /* alter_table_option ::= TTL NK_INTEGER */ -{ yymsp[-1].minor.yy669.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy669.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy645.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy645.val = yymsp[0].minor.yy0; } break; case 190: /* duration_list ::= duration_literal */ - case 351: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==351); -{ yylhsminor.yy152 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy616)); } - yymsp[0].minor.yy152 = yylhsminor.yy152; + case 352: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==352); +{ yylhsminor.yy282 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy778)); } + yymsp[0].minor.yy282 = yylhsminor.yy282; break; case 191: /* duration_list ::= duration_list NK_COMMA duration_literal */ - case 352: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==352); -{ yylhsminor.yy152 = addNodeToList(pCxt, yymsp[-2].minor.yy152, releaseRawExprNode(pCxt, yymsp[0].minor.yy616)); } - yymsp[-2].minor.yy152 = yylhsminor.yy152; + case 353: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==353); +{ yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, releaseRawExprNode(pCxt, yymsp[0].minor.yy778)); } + yymsp[-2].minor.yy282 = yylhsminor.yy282; break; case 194: /* rollup_func_name ::= function_name */ -{ yylhsminor.yy616 = createFunctionNode(pCxt, &yymsp[0].minor.yy673, NULL); } - yymsp[0].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createFunctionNode(pCxt, &yymsp[0].minor.yy181, NULL); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; case 195: /* rollup_func_name ::= FIRST */ case 196: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==196); -{ yylhsminor.yy616 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } - yymsp[0].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; case 199: /* col_name ::= column_name */ -{ yylhsminor.yy616 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy673); } - yymsp[0].minor.yy616 = yylhsminor.yy616; +{ yylhsminor.yy778 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy181); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; case 200: /* cmd ::= SHOW DNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); } @@ -4296,13 +4295,13 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } break; case 203: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy616, yymsp[0].minor.yy616, OP_TYPE_LIKE); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy778, yymsp[0].minor.yy778, OP_TYPE_LIKE); } break; case 204: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy616, yymsp[0].minor.yy616, OP_TYPE_LIKE); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy778, yymsp[0].minor.yy778, OP_TYPE_LIKE); } break; case 205: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy616, NULL, OP_TYPE_LIKE); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy778, NULL, OP_TYPE_LIKE); } break; case 206: /* cmd ::= SHOW MNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); } @@ -4317,7 +4316,7 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); } break; case 210: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy616, yymsp[-1].minor.yy616, OP_TYPE_EQUAL); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy778, yymsp[-1].minor.yy778, OP_TYPE_EQUAL); } break; case 211: /* cmd ::= SHOW STREAMS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); } @@ -4336,13 +4335,13 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCES_STMT); } break; case 217: /* cmd ::= SHOW CREATE DATABASE db_name */ -{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy673); } +{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy181); } break; case 218: /* cmd ::= SHOW CREATE TABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy616); } +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy778); } break; case 219: /* cmd ::= SHOW CREATE STABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy616); } +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy778); } break; case 220: /* cmd ::= SHOW QUERIES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); } @@ -4375,7 +4374,7 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } break; case 230: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ -{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy616); } +{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy778); } break; case 231: /* cmd ::= SHOW CONSUMERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } @@ -4384,732 +4383,736 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } break; case 233: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy616, yymsp[-1].minor.yy616, OP_TYPE_EQUAL); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy778, yymsp[-1].minor.yy778, OP_TYPE_EQUAL); } break; - case 234: /* cmd ::= SHOW VNODES NK_INTEGER */ + case 234: /* cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt */ +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLE_TAGS_STMT, yymsp[0].minor.yy778, yymsp[-1].minor.yy778, OP_TYPE_EQUAL); } + break; + case 235: /* cmd ::= SHOW VNODES NK_INTEGER */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0), NULL); } break; - case 235: /* cmd ::= SHOW VNODES NK_STRING */ + case 236: /* cmd ::= SHOW VNODES NK_STRING */ { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &yymsp[0].minor.yy0)); } break; - case 236: /* db_name_cond_opt ::= */ - case 241: /* from_db_opt ::= */ yytestcase(yyruleno==241); -{ yymsp[1].minor.yy616 = createDefaultDatabaseCondValue(pCxt); } + case 237: /* db_name_cond_opt ::= */ + case 242: /* from_db_opt ::= */ yytestcase(yyruleno==242); +{ yymsp[1].minor.yy778 = createDefaultDatabaseCondValue(pCxt); } break; - case 237: /* db_name_cond_opt ::= db_name NK_DOT */ -{ yylhsminor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy673); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + case 238: /* db_name_cond_opt ::= db_name NK_DOT */ +{ yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy181); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 238: /* like_pattern_opt ::= */ - case 283: /* subtable_opt ::= */ yytestcase(yyruleno==283); - case 395: /* case_when_else_opt ::= */ yytestcase(yyruleno==395); - case 425: /* from_clause_opt ::= */ yytestcase(yyruleno==425); - case 454: /* where_clause_opt ::= */ yytestcase(yyruleno==454); - case 463: /* twindow_clause_opt ::= */ yytestcase(yyruleno==463); - case 468: /* sliding_opt ::= */ yytestcase(yyruleno==468); - case 470: /* fill_opt ::= */ yytestcase(yyruleno==470); - case 482: /* having_clause_opt ::= */ yytestcase(yyruleno==482); - case 484: /* range_opt ::= */ yytestcase(yyruleno==484); - case 486: /* every_opt ::= */ yytestcase(yyruleno==486); - case 499: /* slimit_clause_opt ::= */ yytestcase(yyruleno==499); - case 503: /* limit_clause_opt ::= */ yytestcase(yyruleno==503); -{ yymsp[1].minor.yy616 = NULL; } + case 239: /* like_pattern_opt ::= */ + case 284: /* subtable_opt ::= */ yytestcase(yyruleno==284); + case 397: /* case_when_else_opt ::= */ yytestcase(yyruleno==397); + case 427: /* from_clause_opt ::= */ yytestcase(yyruleno==427); + case 456: /* where_clause_opt ::= */ yytestcase(yyruleno==456); + case 465: /* twindow_clause_opt ::= */ yytestcase(yyruleno==465); + case 470: /* sliding_opt ::= */ yytestcase(yyruleno==470); + case 472: /* fill_opt ::= */ yytestcase(yyruleno==472); + case 484: /* having_clause_opt ::= */ yytestcase(yyruleno==484); + case 486: /* range_opt ::= */ yytestcase(yyruleno==486); + case 488: /* every_opt ::= */ yytestcase(yyruleno==488); + case 501: /* slimit_clause_opt ::= */ yytestcase(yyruleno==501); + case 505: /* limit_clause_opt ::= */ yytestcase(yyruleno==505); +{ yymsp[1].minor.yy778 = NULL; } break; - case 239: /* like_pattern_opt ::= LIKE NK_STRING */ -{ yymsp[-1].minor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + case 240: /* like_pattern_opt ::= LIKE NK_STRING */ +{ yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } break; - case 240: /* table_name_cond ::= table_name */ -{ yylhsminor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy673); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 241: /* table_name_cond ::= table_name */ +{ yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy181); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 242: /* from_db_opt ::= FROM db_name */ -{ yymsp[-1].minor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy673); } + case 243: /* from_db_opt ::= FROM db_name */ +{ yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy181); } break; - case 243: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy89, yymsp[-3].minor.yy616, yymsp[-1].minor.yy616, NULL, yymsp[0].minor.yy616); } + case 244: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy39, yymsp[-3].minor.yy778, yymsp[-1].minor.yy778, NULL, yymsp[0].minor.yy778); } break; - case 244: /* cmd ::= DROP INDEX exists_opt full_table_name */ -{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy89, yymsp[0].minor.yy616); } + case 245: /* cmd ::= DROP INDEX exists_opt full_table_name */ +{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy39, yymsp[0].minor.yy778); } break; - case 245: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-9].minor.yy616 = createIndexOption(pCxt, yymsp[-7].minor.yy152, releaseRawExprNode(pCxt, yymsp[-3].minor.yy616), NULL, yymsp[-1].minor.yy616, yymsp[0].minor.yy616); } + case 246: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ +{ yymsp[-9].minor.yy778 = createIndexOption(pCxt, yymsp[-7].minor.yy282, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), NULL, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 246: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-11].minor.yy616 = createIndexOption(pCxt, yymsp[-9].minor.yy152, releaseRawExprNode(pCxt, yymsp[-5].minor.yy616), releaseRawExprNode(pCxt, yymsp[-3].minor.yy616), yymsp[-1].minor.yy616, yymsp[0].minor.yy616); } + case 247: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ +{ yymsp[-11].minor.yy778 = createIndexOption(pCxt, yymsp[-9].minor.yy282, releaseRawExprNode(pCxt, yymsp[-5].minor.yy778), releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 249: /* func ::= function_name NK_LP expression_list NK_RP */ -{ yylhsminor.yy616 = createFunctionNode(pCxt, &yymsp[-3].minor.yy673, yymsp[-1].minor.yy152); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + case 250: /* func ::= function_name NK_LP expression_list NK_RP */ +{ yylhsminor.yy778 = createFunctionNode(pCxt, &yymsp[-3].minor.yy181, yymsp[-1].minor.yy282); } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 250: /* sma_stream_opt ::= */ - case 277: /* stream_options ::= */ yytestcase(yyruleno==277); -{ yymsp[1].minor.yy616 = createStreamOptions(pCxt); } + case 251: /* sma_stream_opt ::= */ + case 278: /* stream_options ::= */ yytestcase(yyruleno==278); +{ yymsp[1].minor.yy778 = createStreamOptions(pCxt); } break; - case 251: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ - case 281: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==281); -{ ((SStreamOptions*)yymsp[-2].minor.yy616)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy616); yylhsminor.yy616 = yymsp[-2].minor.yy616; } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 252: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ + case 282: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==282); +{ ((SStreamOptions*)yymsp[-2].minor.yy778)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); yylhsminor.yy778 = yymsp[-2].minor.yy778; } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 252: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-2].minor.yy616)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy616); yylhsminor.yy616 = yymsp[-2].minor.yy616; } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 253: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-2].minor.yy778)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); yylhsminor.yy778 = yymsp[-2].minor.yy778; } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 253: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ -{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy89, &yymsp[-2].minor.yy673, yymsp[0].minor.yy616); } + case 254: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ +{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy39, &yymsp[-2].minor.yy181, yymsp[0].minor.yy778); } break; - case 254: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy89, &yymsp[-3].minor.yy673, &yymsp[0].minor.yy673, false); } + case 255: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy39, &yymsp[-3].minor.yy181, &yymsp[0].minor.yy181, false); } break; - case 255: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy89, &yymsp[-5].minor.yy673, &yymsp[0].minor.yy673, true); } + case 256: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy39, &yymsp[-5].minor.yy181, &yymsp[0].minor.yy181, true); } break; - case 256: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy89, &yymsp[-3].minor.yy673, yymsp[0].minor.yy616, false); } + case 257: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy39, &yymsp[-3].minor.yy181, yymsp[0].minor.yy778, false); } break; - case 257: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy89, &yymsp[-5].minor.yy673, yymsp[0].minor.yy616, true); } + case 258: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy39, &yymsp[-5].minor.yy181, yymsp[0].minor.yy778, true); } break; - case 258: /* cmd ::= DROP TOPIC exists_opt topic_name */ -{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy89, &yymsp[0].minor.yy673); } + case 259: /* cmd ::= DROP TOPIC exists_opt topic_name */ +{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy39, &yymsp[0].minor.yy181); } break; - case 259: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ -{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy89, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy673); } + case 260: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ +{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy39, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181); } break; - case 260: /* cmd ::= DESC full_table_name */ - case 261: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==261); -{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy616); } + case 261: /* cmd ::= DESC full_table_name */ + case 262: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==262); +{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy778); } break; - case 262: /* cmd ::= RESET QUERY CACHE */ + case 263: /* cmd ::= RESET QUERY CACHE */ { pCxt->pRootNode = createResetQueryCacheStmt(pCxt); } break; - case 263: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ -{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy89, yymsp[-1].minor.yy616, yymsp[0].minor.yy616); } + case 264: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ +{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy39, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 265: /* analyze_opt ::= ANALYZE */ - case 272: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==272); - case 445: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==445); -{ yymsp[0].minor.yy89 = true; } + case 266: /* analyze_opt ::= ANALYZE */ + case 273: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==273); + case 447: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==447); +{ yymsp[0].minor.yy39 = true; } break; - case 266: /* explain_options ::= */ -{ yymsp[1].minor.yy616 = createDefaultExplainOptions(pCxt); } + case 267: /* explain_options ::= */ +{ yymsp[1].minor.yy778 = createDefaultExplainOptions(pCxt); } break; - case 267: /* explain_options ::= explain_options VERBOSE NK_BOOL */ -{ yylhsminor.yy616 = setExplainVerbose(pCxt, yymsp[-2].minor.yy616, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 268: /* explain_options ::= explain_options VERBOSE NK_BOOL */ +{ yylhsminor.yy778 = setExplainVerbose(pCxt, yymsp[-2].minor.yy778, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 268: /* explain_options ::= explain_options RATIO NK_FLOAT */ -{ yylhsminor.yy616 = setExplainRatio(pCxt, yymsp[-2].minor.yy616, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 269: /* explain_options ::= explain_options RATIO NK_FLOAT */ +{ yylhsminor.yy778 = setExplainRatio(pCxt, yymsp[-2].minor.yy778, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 269: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ -{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy89, yymsp[-8].minor.yy89, &yymsp[-5].minor.yy673, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy784, yymsp[0].minor.yy452); } + case 270: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ +{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy39, yymsp[-8].minor.yy39, &yymsp[-5].minor.yy181, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy380, yymsp[0].minor.yy276); } break; - case 270: /* cmd ::= DROP FUNCTION exists_opt function_name */ -{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy89, &yymsp[0].minor.yy673); } + case 271: /* cmd ::= DROP FUNCTION exists_opt function_name */ +{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy39, &yymsp[0].minor.yy181); } break; - case 275: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ -{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-8].minor.yy89, &yymsp[-7].minor.yy673, yymsp[-4].minor.yy616, yymsp[-6].minor.yy616, yymsp[-3].minor.yy152, yymsp[-2].minor.yy616, yymsp[0].minor.yy616); } + case 276: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */ +{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-8].minor.yy39, &yymsp[-7].minor.yy181, yymsp[-4].minor.yy778, yymsp[-6].minor.yy778, yymsp[-3].minor.yy282, yymsp[-2].minor.yy778, yymsp[0].minor.yy778); } break; - case 276: /* cmd ::= DROP STREAM exists_opt stream_name */ -{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy89, &yymsp[0].minor.yy673); } + case 277: /* cmd ::= DROP STREAM exists_opt stream_name */ +{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy39, &yymsp[0].minor.yy181); } break; - case 278: /* stream_options ::= stream_options TRIGGER AT_ONCE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy616)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy616 = yymsp[-2].minor.yy616; } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 279: /* stream_options ::= stream_options TRIGGER AT_ONCE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy778)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy778 = yymsp[-2].minor.yy778; } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 279: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy616)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy616 = yymsp[-2].minor.yy616; } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 280: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy778)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy778 = yymsp[-2].minor.yy778; } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 280: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-3].minor.yy616)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy616)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy616); yylhsminor.yy616 = yymsp[-3].minor.yy616; } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + case 281: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-3].minor.yy778)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy778)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); yylhsminor.yy778 = yymsp[-3].minor.yy778; } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 282: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ -{ ((SStreamOptions*)yymsp[-3].minor.yy616)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy616 = yymsp[-3].minor.yy616; } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + case 283: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ +{ ((SStreamOptions*)yymsp[-3].minor.yy778)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy778 = yymsp[-3].minor.yy778; } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 284: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ - case 469: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==469); - case 487: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==487); -{ yymsp[-3].minor.yy616 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy616); } + case 285: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ + case 471: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==471); + case 489: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==489); +{ yymsp[-3].minor.yy778 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy778); } break; - case 285: /* cmd ::= KILL CONNECTION NK_INTEGER */ + case 286: /* cmd ::= KILL CONNECTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); } break; - case 286: /* cmd ::= KILL QUERY NK_STRING */ + case 287: /* cmd ::= KILL QUERY NK_STRING */ { pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 287: /* cmd ::= KILL TRANSACTION NK_INTEGER */ + case 288: /* cmd ::= KILL TRANSACTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); } break; - case 288: /* cmd ::= BALANCE VGROUP */ + case 289: /* cmd ::= BALANCE VGROUP */ { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); } break; - case 289: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + case 290: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 290: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ -{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy152); } + case 291: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ +{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy282); } break; - case 291: /* cmd ::= SPLIT VGROUP NK_INTEGER */ + case 292: /* cmd ::= SPLIT VGROUP NK_INTEGER */ { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 292: /* dnode_list ::= DNODE NK_INTEGER */ -{ yymsp[-1].minor.yy152 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + case 293: /* dnode_list ::= DNODE NK_INTEGER */ +{ yymsp[-1].minor.yy282 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } break; - case 294: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ -{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy616, yymsp[0].minor.yy616); } + case 295: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ +{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 296: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy616, yymsp[-2].minor.yy152, yymsp[0].minor.yy616); } + case 297: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy778, yymsp[-2].minor.yy282, yymsp[0].minor.yy778); } break; - case 297: /* cmd ::= INSERT INTO full_table_name query_or_subquery */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy616, NULL, yymsp[0].minor.yy616); } + case 298: /* cmd ::= INSERT INTO full_table_name query_or_subquery */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy778, NULL, yymsp[0].minor.yy778); } break; - case 298: /* literal ::= NK_INTEGER */ -{ yylhsminor.yy616 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 299: /* literal ::= NK_INTEGER */ +{ yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 299: /* literal ::= NK_FLOAT */ -{ yylhsminor.yy616 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 300: /* literal ::= NK_FLOAT */ +{ yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 300: /* literal ::= NK_STRING */ -{ yylhsminor.yy616 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 301: /* literal ::= NK_STRING */ +{ yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 301: /* literal ::= NK_BOOL */ -{ yylhsminor.yy616 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 302: /* literal ::= NK_BOOL */ +{ yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 302: /* literal ::= TIMESTAMP NK_STRING */ -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + case 303: /* literal ::= TIMESTAMP NK_STRING */ +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 303: /* literal ::= duration_literal */ - case 313: /* signed_literal ::= signed */ yytestcase(yyruleno==313); - case 333: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==333); - case 334: /* expr_or_subquery ::= subquery */ yytestcase(yyruleno==334); - case 335: /* expression ::= literal */ yytestcase(yyruleno==335); - case 336: /* expression ::= pseudo_column */ yytestcase(yyruleno==336); - case 337: /* expression ::= column_reference */ yytestcase(yyruleno==337); - case 338: /* expression ::= function_expression */ yytestcase(yyruleno==338); - case 339: /* expression ::= case_when_expression */ yytestcase(yyruleno==339); - case 368: /* function_expression ::= literal_func */ yytestcase(yyruleno==368); - case 417: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==417); - case 421: /* boolean_primary ::= predicate */ yytestcase(yyruleno==421); - case 423: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==423); - case 424: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==424); - case 427: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==427); - case 429: /* table_reference ::= table_primary */ yytestcase(yyruleno==429); - case 430: /* table_reference ::= joined_table */ yytestcase(yyruleno==430); - case 434: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==434); - case 489: /* query_simple ::= query_specification */ yytestcase(yyruleno==489); - case 490: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==490); - case 493: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==493); - case 495: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==495); -{ yylhsminor.yy616 = yymsp[0].minor.yy616; } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 304: /* literal ::= duration_literal */ + case 314: /* signed_literal ::= signed */ yytestcase(yyruleno==314); + case 334: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==334); + case 335: /* expr_or_subquery ::= subquery */ yytestcase(yyruleno==335); + case 336: /* expression ::= literal */ yytestcase(yyruleno==336); + case 337: /* expression ::= pseudo_column */ yytestcase(yyruleno==337); + case 338: /* expression ::= column_reference */ yytestcase(yyruleno==338); + case 339: /* expression ::= function_expression */ yytestcase(yyruleno==339); + case 340: /* expression ::= case_when_expression */ yytestcase(yyruleno==340); + case 370: /* function_expression ::= literal_func */ yytestcase(yyruleno==370); + case 419: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==419); + case 423: /* boolean_primary ::= predicate */ yytestcase(yyruleno==423); + case 425: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==425); + case 426: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==426); + case 429: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==429); + case 431: /* table_reference ::= table_primary */ yytestcase(yyruleno==431); + case 432: /* table_reference ::= joined_table */ yytestcase(yyruleno==432); + case 436: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==436); + case 491: /* query_simple ::= query_specification */ yytestcase(yyruleno==491); + case 492: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==492); + case 495: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==495); + case 497: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==497); +{ yylhsminor.yy778 = yymsp[0].minor.yy778; } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 304: /* literal ::= NULL */ -{ yylhsminor.yy616 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 305: /* literal ::= NULL */ +{ yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 305: /* literal ::= NK_QUESTION */ -{ yylhsminor.yy616 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 306: /* literal ::= NK_QUESTION */ +{ yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 306: /* duration_literal ::= NK_VARIABLE */ -{ yylhsminor.yy616 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 307: /* duration_literal ::= NK_VARIABLE */ +{ yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 307: /* signed ::= NK_INTEGER */ -{ yylhsminor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 308: /* signed ::= NK_INTEGER */ +{ yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 308: /* signed ::= NK_PLUS NK_INTEGER */ -{ yymsp[-1].minor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } + case 309: /* signed ::= NK_PLUS NK_INTEGER */ +{ yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } break; - case 309: /* signed ::= NK_MINUS NK_INTEGER */ + case 310: /* signed ::= NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); + yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 310: /* signed ::= NK_FLOAT */ -{ yylhsminor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 311: /* signed ::= NK_FLOAT */ +{ yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 311: /* signed ::= NK_PLUS NK_FLOAT */ -{ yymsp[-1].minor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + case 312: /* signed ::= NK_PLUS NK_FLOAT */ +{ yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } break; - case 312: /* signed ::= NK_MINUS NK_FLOAT */ + case 313: /* signed ::= NK_MINUS NK_FLOAT */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); + yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 314: /* signed_literal ::= NK_STRING */ -{ yylhsminor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 315: /* signed_literal ::= NK_STRING */ +{ yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 315: /* signed_literal ::= NK_BOOL */ -{ yylhsminor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 316: /* signed_literal ::= NK_BOOL */ +{ yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 316: /* signed_literal ::= TIMESTAMP NK_STRING */ -{ yymsp[-1].minor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } + case 317: /* signed_literal ::= TIMESTAMP NK_STRING */ +{ yymsp[-1].minor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } break; - case 317: /* signed_literal ::= duration_literal */ - case 319: /* signed_literal ::= literal_func */ yytestcase(yyruleno==319); - case 388: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==388); - case 450: /* select_item ::= common_expression */ yytestcase(yyruleno==450); - case 460: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==460); - case 494: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==494); - case 496: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==496); - case 509: /* search_condition ::= common_expression */ yytestcase(yyruleno==509); -{ yylhsminor.yy616 = releaseRawExprNode(pCxt, yymsp[0].minor.yy616); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 318: /* signed_literal ::= duration_literal */ + case 320: /* signed_literal ::= literal_func */ yytestcase(yyruleno==320); + case 390: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==390); + case 452: /* select_item ::= common_expression */ yytestcase(yyruleno==452); + case 462: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==462); + case 496: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==496); + case 498: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==498); + case 511: /* search_condition ::= common_expression */ yytestcase(yyruleno==511); +{ yylhsminor.yy778 = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 318: /* signed_literal ::= NULL */ -{ yylhsminor.yy616 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 319: /* signed_literal ::= NULL */ +{ yylhsminor.yy778 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 320: /* signed_literal ::= NK_QUESTION */ -{ yylhsminor.yy616 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 321: /* signed_literal ::= NK_QUESTION */ +{ yylhsminor.yy778 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 340: /* expression ::= NK_LP expression NK_RP */ - case 422: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==422); - case 508: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==508); -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy616)); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 341: /* expression ::= NK_LP expression NK_RP */ + case 424: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==424); + case 510: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==510); +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy778)); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 341: /* expression ::= NK_PLUS expr_or_subquery */ + case 342: /* expression ::= NK_PLUS expr_or_subquery */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy616)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy778)); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 342: /* expression ::= NK_MINUS expr_or_subquery */ + case 343: /* expression ::= NK_MINUS expr_or_subquery */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy616), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy778), NULL)); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 343: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ + case 344: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 344: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ + case 345: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 345: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */ + case 346: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 346: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ + case 347: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 347: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */ + case 348: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 348: /* expression ::= column_reference NK_ARROW NK_STRING */ + case 349: /* expression ::= column_reference NK_ARROW NK_STRING */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 349: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ + case 350: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 350: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ + case 351: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 353: /* column_reference ::= column_name */ -{ yylhsminor.yy616 = createRawExprNode(pCxt, &yymsp[0].minor.yy673, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy673)); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 354: /* column_reference ::= column_name */ +{ yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy181, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy181)); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 354: /* column_reference ::= table_name NK_DOT column_name */ -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy673, createColumnNode(pCxt, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy673)); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 355: /* column_reference ::= table_name NK_DOT column_name */ +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181, createColumnNode(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy181)); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 355: /* pseudo_column ::= ROWTS */ - case 356: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==356); - case 358: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==358); - case 359: /* pseudo_column ::= QEND */ yytestcase(yyruleno==359); - case 360: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==360); - case 361: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==361); - case 362: /* pseudo_column ::= WEND */ yytestcase(yyruleno==362); - case 363: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==363); - case 364: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==364); - case 370: /* literal_func ::= NOW */ yytestcase(yyruleno==370); -{ yylhsminor.yy616 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 356: /* pseudo_column ::= ROWTS */ + case 357: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==357); + case 359: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==359); + case 360: /* pseudo_column ::= QEND */ yytestcase(yyruleno==360); + case 361: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==361); + case 362: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==362); + case 363: /* pseudo_column ::= WEND */ yytestcase(yyruleno==363); + case 364: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==364); + case 365: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==365); + case 366: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==366); + case 372: /* literal_func ::= NOW */ yytestcase(yyruleno==372); +{ yylhsminor.yy778 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 357: /* pseudo_column ::= table_name NK_DOT TBNAME */ -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy673)))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 358: /* pseudo_column ::= table_name NK_DOT TBNAME */ +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy181)))); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 365: /* function_expression ::= function_name NK_LP expression_list NK_RP */ - case 366: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==366); -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy673, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy673, yymsp[-1].minor.yy152)); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + case 367: /* function_expression ::= function_name NK_LP expression_list NK_RP */ + case 368: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==368); +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy181, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy181, yymsp[-1].minor.yy282)); } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 367: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy616), yymsp[-1].minor.yy784)); } - yymsp[-5].minor.yy616 = yylhsminor.yy616; + case 369: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */ +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), yymsp[-1].minor.yy380)); } + yymsp[-5].minor.yy778 = yylhsminor.yy778; break; - case 369: /* literal_func ::= noarg_func NK_LP NK_RP */ -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy673, NULL)); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 371: /* literal_func ::= noarg_func NK_LP NK_RP */ +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy181, NULL)); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 384: /* star_func_para_list ::= NK_STAR */ -{ yylhsminor.yy152 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy152 = yylhsminor.yy152; + case 386: /* star_func_para_list ::= NK_STAR */ +{ yylhsminor.yy282 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy282 = yylhsminor.yy282; break; - case 389: /* star_func_para ::= table_name NK_DOT NK_STAR */ - case 453: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==453); -{ yylhsminor.yy616 = createColumnNode(pCxt, &yymsp[-2].minor.yy673, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 391: /* star_func_para ::= table_name NK_DOT NK_STAR */ + case 455: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==455); +{ yylhsminor.yy778 = createColumnNode(pCxt, &yymsp[-2].minor.yy181, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 390: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */ -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy152, yymsp[-1].minor.yy616)); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + case 392: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */ +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy282, yymsp[-1].minor.yy778)); } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 391: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy616), yymsp[-2].minor.yy152, yymsp[-1].minor.yy616)); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; + case 393: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */ +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), yymsp[-2].minor.yy282, yymsp[-1].minor.yy778)); } + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 394: /* when_then_expr ::= WHEN common_expression THEN common_expression */ -{ yymsp[-3].minor.yy616 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616)); } + case 396: /* when_then_expr ::= WHEN common_expression THEN common_expression */ +{ yymsp[-3].minor.yy778 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778)); } break; - case 396: /* case_when_else_opt ::= ELSE common_expression */ -{ yymsp[-1].minor.yy616 = releaseRawExprNode(pCxt, yymsp[0].minor.yy616); } + case 398: /* case_when_else_opt ::= ELSE common_expression */ +{ yymsp[-1].minor.yy778 = releaseRawExprNode(pCxt, yymsp[0].minor.yy778); } break; - case 397: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */ - case 402: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==402); + case 399: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */ + case 404: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==404); { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy380, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy682, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 398: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ + case 400: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy616), releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy778), releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-4].minor.yy616 = yylhsminor.yy616; + yymsp[-4].minor.yy778 = yylhsminor.yy778; break; - case 399: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ + case 401: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy616), releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy778), releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-5].minor.yy616 = yylhsminor.yy616; + yymsp[-5].minor.yy778 = yylhsminor.yy778; break; - case 400: /* predicate ::= expr_or_subquery IS NULL */ + case 402: /* predicate ::= expr_or_subquery IS NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), NULL)); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 401: /* predicate ::= expr_or_subquery IS NOT NULL */ + case 403: /* predicate ::= expr_or_subquery IS NOT NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy616), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), NULL)); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 403: /* compare_op ::= NK_LT */ -{ yymsp[0].minor.yy380 = OP_TYPE_LOWER_THAN; } + case 405: /* compare_op ::= NK_LT */ +{ yymsp[0].minor.yy682 = OP_TYPE_LOWER_THAN; } break; - case 404: /* compare_op ::= NK_GT */ -{ yymsp[0].minor.yy380 = OP_TYPE_GREATER_THAN; } + case 406: /* compare_op ::= NK_GT */ +{ yymsp[0].minor.yy682 = OP_TYPE_GREATER_THAN; } break; - case 405: /* compare_op ::= NK_LE */ -{ yymsp[0].minor.yy380 = OP_TYPE_LOWER_EQUAL; } + case 407: /* compare_op ::= NK_LE */ +{ yymsp[0].minor.yy682 = OP_TYPE_LOWER_EQUAL; } break; - case 406: /* compare_op ::= NK_GE */ -{ yymsp[0].minor.yy380 = OP_TYPE_GREATER_EQUAL; } + case 408: /* compare_op ::= NK_GE */ +{ yymsp[0].minor.yy682 = OP_TYPE_GREATER_EQUAL; } break; - case 407: /* compare_op ::= NK_NE */ -{ yymsp[0].minor.yy380 = OP_TYPE_NOT_EQUAL; } + case 409: /* compare_op ::= NK_NE */ +{ yymsp[0].minor.yy682 = OP_TYPE_NOT_EQUAL; } break; - case 408: /* compare_op ::= NK_EQ */ -{ yymsp[0].minor.yy380 = OP_TYPE_EQUAL; } + case 410: /* compare_op ::= NK_EQ */ +{ yymsp[0].minor.yy682 = OP_TYPE_EQUAL; } break; - case 409: /* compare_op ::= LIKE */ -{ yymsp[0].minor.yy380 = OP_TYPE_LIKE; } + case 411: /* compare_op ::= LIKE */ +{ yymsp[0].minor.yy682 = OP_TYPE_LIKE; } break; - case 410: /* compare_op ::= NOT LIKE */ -{ yymsp[-1].minor.yy380 = OP_TYPE_NOT_LIKE; } + case 412: /* compare_op ::= NOT LIKE */ +{ yymsp[-1].minor.yy682 = OP_TYPE_NOT_LIKE; } break; - case 411: /* compare_op ::= MATCH */ -{ yymsp[0].minor.yy380 = OP_TYPE_MATCH; } + case 413: /* compare_op ::= MATCH */ +{ yymsp[0].minor.yy682 = OP_TYPE_MATCH; } break; - case 412: /* compare_op ::= NMATCH */ -{ yymsp[0].minor.yy380 = OP_TYPE_NMATCH; } + case 414: /* compare_op ::= NMATCH */ +{ yymsp[0].minor.yy682 = OP_TYPE_NMATCH; } break; - case 413: /* compare_op ::= CONTAINS */ -{ yymsp[0].minor.yy380 = OP_TYPE_JSON_CONTAINS; } + case 415: /* compare_op ::= CONTAINS */ +{ yymsp[0].minor.yy682 = OP_TYPE_JSON_CONTAINS; } break; - case 414: /* in_op ::= IN */ -{ yymsp[0].minor.yy380 = OP_TYPE_IN; } + case 416: /* in_op ::= IN */ +{ yymsp[0].minor.yy682 = OP_TYPE_IN; } break; - case 415: /* in_op ::= NOT IN */ -{ yymsp[-1].minor.yy380 = OP_TYPE_NOT_IN; } + case 417: /* in_op ::= NOT IN */ +{ yymsp[-1].minor.yy682 = OP_TYPE_NOT_IN; } break; - case 416: /* in_predicate_value ::= NK_LP literal_list NK_RP */ -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy152)); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 418: /* in_predicate_value ::= NK_LP literal_list NK_RP */ +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy282)); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 418: /* boolean_value_expression ::= NOT boolean_primary */ + case 420: /* boolean_value_expression ::= NOT boolean_primary */ { - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy616), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy778), NULL)); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 419: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 421: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 420: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 422: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy616); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy616); - yylhsminor.yy616 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy778); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy778); + yylhsminor.yy778 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 426: /* from_clause_opt ::= FROM table_reference_list */ - case 455: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==455); - case 483: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==483); -{ yymsp[-1].minor.yy616 = yymsp[0].minor.yy616; } + case 428: /* from_clause_opt ::= FROM table_reference_list */ + case 457: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==457); + case 485: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==485); +{ yymsp[-1].minor.yy778 = yymsp[0].minor.yy778; } break; - case 428: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ yylhsminor.yy616 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy616, yymsp[0].minor.yy616, NULL); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 430: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ yylhsminor.yy778 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy778, yymsp[0].minor.yy778, NULL); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 431: /* table_primary ::= table_name alias_opt */ -{ yylhsminor.yy616 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy673, &yymsp[0].minor.yy673); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + case 433: /* table_primary ::= table_name alias_opt */ +{ yylhsminor.yy778 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy181, &yymsp[0].minor.yy181); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 432: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -{ yylhsminor.yy616 = createRealTableNode(pCxt, &yymsp[-3].minor.yy673, &yymsp[-1].minor.yy673, &yymsp[0].minor.yy673); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + case 434: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ yylhsminor.yy778 = createRealTableNode(pCxt, &yymsp[-3].minor.yy181, &yymsp[-1].minor.yy181, &yymsp[0].minor.yy181); } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 433: /* table_primary ::= subquery alias_opt */ -{ yylhsminor.yy616 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy616), &yymsp[0].minor.yy673); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + case 435: /* table_primary ::= subquery alias_opt */ +{ yylhsminor.yy778 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy778), &yymsp[0].minor.yy181); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 435: /* alias_opt ::= */ -{ yymsp[1].minor.yy673 = nil_token; } + case 437: /* alias_opt ::= */ +{ yymsp[1].minor.yy181 = nil_token; } break; - case 436: /* alias_opt ::= table_alias */ -{ yylhsminor.yy673 = yymsp[0].minor.yy673; } - yymsp[0].minor.yy673 = yylhsminor.yy673; + case 438: /* alias_opt ::= table_alias */ +{ yylhsminor.yy181 = yymsp[0].minor.yy181; } + yymsp[0].minor.yy181 = yylhsminor.yy181; break; - case 437: /* alias_opt ::= AS table_alias */ -{ yymsp[-1].minor.yy673 = yymsp[0].minor.yy673; } + case 439: /* alias_opt ::= AS table_alias */ +{ yymsp[-1].minor.yy181 = yymsp[0].minor.yy181; } break; - case 438: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 439: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==439); -{ yymsp[-2].minor.yy616 = yymsp[-1].minor.yy616; } + case 440: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 441: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==441); +{ yymsp[-2].minor.yy778 = yymsp[-1].minor.yy778; } break; - case 440: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -{ yylhsminor.yy616 = createJoinTableNode(pCxt, yymsp[-4].minor.yy596, yymsp[-5].minor.yy616, yymsp[-2].minor.yy616, yymsp[0].minor.yy616); } - yymsp[-5].minor.yy616 = yylhsminor.yy616; + case 442: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ yylhsminor.yy778 = createJoinTableNode(pCxt, yymsp[-4].minor.yy202, yymsp[-5].minor.yy778, yymsp[-2].minor.yy778, yymsp[0].minor.yy778); } + yymsp[-5].minor.yy778 = yylhsminor.yy778; break; - case 441: /* join_type ::= */ -{ yymsp[1].minor.yy596 = JOIN_TYPE_INNER; } + case 443: /* join_type ::= */ +{ yymsp[1].minor.yy202 = JOIN_TYPE_INNER; } break; - case 442: /* join_type ::= INNER */ -{ yymsp[0].minor.yy596 = JOIN_TYPE_INNER; } + case 444: /* join_type ::= INNER */ +{ yymsp[0].minor.yy202 = JOIN_TYPE_INNER; } break; - case 443: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ + case 445: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ { - yymsp[-11].minor.yy616 = createSelectStmt(pCxt, yymsp[-10].minor.yy89, yymsp[-9].minor.yy152, yymsp[-8].minor.yy616); - yymsp[-11].minor.yy616 = addWhereClause(pCxt, yymsp[-11].minor.yy616, yymsp[-7].minor.yy616); - yymsp[-11].minor.yy616 = addPartitionByClause(pCxt, yymsp[-11].minor.yy616, yymsp[-6].minor.yy152); - yymsp[-11].minor.yy616 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy616, yymsp[-2].minor.yy616); - yymsp[-11].minor.yy616 = addGroupByClause(pCxt, yymsp[-11].minor.yy616, yymsp[-1].minor.yy152); - yymsp[-11].minor.yy616 = addHavingClause(pCxt, yymsp[-11].minor.yy616, yymsp[0].minor.yy616); - yymsp[-11].minor.yy616 = addRangeClause(pCxt, yymsp[-11].minor.yy616, yymsp[-5].minor.yy616); - yymsp[-11].minor.yy616 = addEveryClause(pCxt, yymsp[-11].minor.yy616, yymsp[-4].minor.yy616); - yymsp[-11].minor.yy616 = addFillClause(pCxt, yymsp[-11].minor.yy616, yymsp[-3].minor.yy616); + yymsp[-11].minor.yy778 = createSelectStmt(pCxt, yymsp[-10].minor.yy39, yymsp[-9].minor.yy282, yymsp[-8].minor.yy778); + yymsp[-11].minor.yy778 = addWhereClause(pCxt, yymsp[-11].minor.yy778, yymsp[-7].minor.yy778); + yymsp[-11].minor.yy778 = addPartitionByClause(pCxt, yymsp[-11].minor.yy778, yymsp[-6].minor.yy282); + yymsp[-11].minor.yy778 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy778, yymsp[-2].minor.yy778); + yymsp[-11].minor.yy778 = addGroupByClause(pCxt, yymsp[-11].minor.yy778, yymsp[-1].minor.yy282); + yymsp[-11].minor.yy778 = addHavingClause(pCxt, yymsp[-11].minor.yy778, yymsp[0].minor.yy778); + yymsp[-11].minor.yy778 = addRangeClause(pCxt, yymsp[-11].minor.yy778, yymsp[-5].minor.yy778); + yymsp[-11].minor.yy778 = addEveryClause(pCxt, yymsp[-11].minor.yy778, yymsp[-4].minor.yy778); + yymsp[-11].minor.yy778 = addFillClause(pCxt, yymsp[-11].minor.yy778, yymsp[-3].minor.yy778); } break; - case 446: /* set_quantifier_opt ::= ALL */ -{ yymsp[0].minor.yy89 = false; } + case 448: /* set_quantifier_opt ::= ALL */ +{ yymsp[0].minor.yy39 = false; } break; - case 449: /* select_item ::= NK_STAR */ -{ yylhsminor.yy616 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy616 = yylhsminor.yy616; + case 451: /* select_item ::= NK_STAR */ +{ yylhsminor.yy778 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy778 = yylhsminor.yy778; break; - case 451: /* select_item ::= common_expression column_alias */ - case 461: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==461); -{ yylhsminor.yy616 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy616), &yymsp[0].minor.yy673); } - yymsp[-1].minor.yy616 = yylhsminor.yy616; + case 453: /* select_item ::= common_expression column_alias */ + case 463: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==463); +{ yylhsminor.yy778 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy778), &yymsp[0].minor.yy181); } + yymsp[-1].minor.yy778 = yylhsminor.yy778; break; - case 452: /* select_item ::= common_expression AS column_alias */ - case 462: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==462); -{ yylhsminor.yy616 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), &yymsp[0].minor.yy673); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 454: /* select_item ::= common_expression AS column_alias */ + case 464: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==464); +{ yylhsminor.yy778 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), &yymsp[0].minor.yy181); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 457: /* partition_by_clause_opt ::= PARTITION BY partition_list */ - case 479: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==479); - case 498: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==498); -{ yymsp[-2].minor.yy152 = yymsp[0].minor.yy152; } + case 459: /* partition_by_clause_opt ::= PARTITION BY partition_list */ + case 481: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==481); + case 500: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==500); +{ yymsp[-2].minor.yy282 = yymsp[0].minor.yy282; } break; - case 464: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ -{ yymsp[-5].minor.yy616 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy616), releaseRawExprNode(pCxt, yymsp[-1].minor.yy616)); } + case 466: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ +{ yymsp[-5].minor.yy778 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), releaseRawExprNode(pCxt, yymsp[-1].minor.yy778)); } break; - case 465: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ -{ yymsp[-3].minor.yy616 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy616)); } + case 467: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */ +{ yymsp[-3].minor.yy778 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy778)); } break; - case 466: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-5].minor.yy616 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy616), NULL, yymsp[-1].minor.yy616, yymsp[0].minor.yy616); } + case 468: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-5].minor.yy778 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), NULL, yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 467: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-7].minor.yy616 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy616), releaseRawExprNode(pCxt, yymsp[-3].minor.yy616), yymsp[-1].minor.yy616, yymsp[0].minor.yy616); } + case 469: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-7].minor.yy778 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy778), releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), yymsp[-1].minor.yy778, yymsp[0].minor.yy778); } break; - case 471: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -{ yymsp[-3].minor.yy616 = createFillNode(pCxt, yymsp[-1].minor.yy102, NULL); } + case 473: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ yymsp[-3].minor.yy778 = createFillNode(pCxt, yymsp[-1].minor.yy381, NULL); } break; - case 472: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ -{ yymsp[-5].minor.yy616 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy152)); } + case 474: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ +{ yymsp[-5].minor.yy778 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy282)); } break; - case 473: /* fill_mode ::= NONE */ -{ yymsp[0].minor.yy102 = FILL_MODE_NONE; } + case 475: /* fill_mode ::= NONE */ +{ yymsp[0].minor.yy381 = FILL_MODE_NONE; } break; - case 474: /* fill_mode ::= PREV */ -{ yymsp[0].minor.yy102 = FILL_MODE_PREV; } + case 476: /* fill_mode ::= PREV */ +{ yymsp[0].minor.yy381 = FILL_MODE_PREV; } break; - case 475: /* fill_mode ::= NULL */ -{ yymsp[0].minor.yy102 = FILL_MODE_NULL; } + case 477: /* fill_mode ::= NULL */ +{ yymsp[0].minor.yy381 = FILL_MODE_NULL; } break; - case 476: /* fill_mode ::= LINEAR */ -{ yymsp[0].minor.yy102 = FILL_MODE_LINEAR; } + case 478: /* fill_mode ::= LINEAR */ +{ yymsp[0].minor.yy381 = FILL_MODE_LINEAR; } break; - case 477: /* fill_mode ::= NEXT */ -{ yymsp[0].minor.yy102 = FILL_MODE_NEXT; } + case 479: /* fill_mode ::= NEXT */ +{ yymsp[0].minor.yy381 = FILL_MODE_NEXT; } break; - case 480: /* group_by_list ::= expr_or_subquery */ -{ yylhsminor.yy152 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); } - yymsp[0].minor.yy152 = yylhsminor.yy152; + case 482: /* group_by_list ::= expr_or_subquery */ +{ yylhsminor.yy282 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } + yymsp[0].minor.yy282 = yylhsminor.yy282; break; - case 481: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ -{ yylhsminor.yy152 = addNodeToList(pCxt, yymsp[-2].minor.yy152, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy616))); } - yymsp[-2].minor.yy152 = yylhsminor.yy152; + case 483: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */ +{ yylhsminor.yy282 = addNodeToList(pCxt, yymsp[-2].minor.yy282, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy778))); } + yymsp[-2].minor.yy282 = yylhsminor.yy282; break; - case 485: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ -{ yymsp[-5].minor.yy616 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy616), releaseRawExprNode(pCxt, yymsp[-1].minor.yy616)); } + case 487: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */ +{ yymsp[-5].minor.yy778 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy778), releaseRawExprNode(pCxt, yymsp[-1].minor.yy778)); } break; - case 488: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 490: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */ { - yylhsminor.yy616 = addOrderByClause(pCxt, yymsp[-3].minor.yy616, yymsp[-2].minor.yy152); - yylhsminor.yy616 = addSlimitClause(pCxt, yylhsminor.yy616, yymsp[-1].minor.yy616); - yylhsminor.yy616 = addLimitClause(pCxt, yylhsminor.yy616, yymsp[0].minor.yy616); + yylhsminor.yy778 = addOrderByClause(pCxt, yymsp[-3].minor.yy778, yymsp[-2].minor.yy282); + yylhsminor.yy778 = addSlimitClause(pCxt, yylhsminor.yy778, yymsp[-1].minor.yy778); + yylhsminor.yy778 = addLimitClause(pCxt, yylhsminor.yy778, yymsp[0].minor.yy778); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 491: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ -{ yylhsminor.yy616 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy616, yymsp[0].minor.yy616); } - yymsp[-3].minor.yy616 = yylhsminor.yy616; + case 493: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */ +{ yylhsminor.yy778 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy778, yymsp[0].minor.yy778); } + yymsp[-3].minor.yy778 = yylhsminor.yy778; break; - case 492: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ -{ yylhsminor.yy616 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy616, yymsp[0].minor.yy616); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 494: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */ +{ yylhsminor.yy778 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy778, yymsp[0].minor.yy778); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 500: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 504: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==504); -{ yymsp[-1].minor.yy616 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } + case 502: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 506: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==506); +{ yymsp[-1].minor.yy778 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 501: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 505: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==505); -{ yymsp[-3].minor.yy616 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } + case 503: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 507: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==507); +{ yymsp[-3].minor.yy778 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 502: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 506: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==506); -{ yymsp[-3].minor.yy616 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } + case 504: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 508: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==508); +{ yymsp[-3].minor.yy778 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 507: /* subquery ::= NK_LP query_expression NK_RP */ -{ yylhsminor.yy616 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy616); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 509: /* subquery ::= NK_LP query_expression NK_RP */ +{ yylhsminor.yy778 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy778); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 512: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ -{ yylhsminor.yy616 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy616), yymsp[-1].minor.yy386, yymsp[0].minor.yy585); } - yymsp[-2].minor.yy616 = yylhsminor.yy616; + case 514: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */ +{ yylhsminor.yy778 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy778), yymsp[-1].minor.yy14, yymsp[0].minor.yy305); } + yymsp[-2].minor.yy778 = yylhsminor.yy778; break; - case 513: /* ordering_specification_opt ::= */ -{ yymsp[1].minor.yy386 = ORDER_ASC; } + case 515: /* ordering_specification_opt ::= */ +{ yymsp[1].minor.yy14 = ORDER_ASC; } break; - case 514: /* ordering_specification_opt ::= ASC */ -{ yymsp[0].minor.yy386 = ORDER_ASC; } + case 516: /* ordering_specification_opt ::= ASC */ +{ yymsp[0].minor.yy14 = ORDER_ASC; } break; - case 515: /* ordering_specification_opt ::= DESC */ -{ yymsp[0].minor.yy386 = ORDER_DESC; } + case 517: /* ordering_specification_opt ::= DESC */ +{ yymsp[0].minor.yy14 = ORDER_DESC; } break; - case 516: /* null_ordering_opt ::= */ -{ yymsp[1].minor.yy585 = NULL_ORDER_DEFAULT; } + case 518: /* null_ordering_opt ::= */ +{ yymsp[1].minor.yy305 = NULL_ORDER_DEFAULT; } break; - case 517: /* null_ordering_opt ::= NULLS FIRST */ -{ yymsp[-1].minor.yy585 = NULL_ORDER_FIRST; } + case 519: /* null_ordering_opt ::= NULLS FIRST */ +{ yymsp[-1].minor.yy305 = NULL_ORDER_FIRST; } break; - case 518: /* null_ordering_opt ::= NULLS LAST */ -{ yymsp[-1].minor.yy585 = NULL_ORDER_LAST; } + case 520: /* null_ordering_opt ::= NULLS LAST */ +{ yymsp[-1].minor.yy305 = NULL_ORDER_LAST; } break; default: break; diff --git a/source/libs/planner/test/planBasicTest.cpp b/source/libs/planner/test/planBasicTest.cpp index aeb78f4030..0baec147a2 100644 --- a/source/libs/planner/test/planBasicTest.cpp +++ b/source/libs/planner/test/planBasicTest.cpp @@ -180,6 +180,8 @@ TEST_F(PlanBasicTest, pseudoColumn) { run("SELECT _QSTART, _QEND, _QDURATION, _WSTART, _WEND, _WDURATION, COUNT(*) FROM t1 " "WHERE ts BETWEEN '2017-7-14 18:00:00' AND '2017-7-14 19:00:00' INTERVAL(10S)"); + + run("SELECT _TAGS, * FROM st1s1"); } TEST_F(PlanBasicTest, indefiniteRowsFunc) { diff --git a/source/libs/planner/test/planOtherTest.cpp b/source/libs/planner/test/planOtherTest.cpp index 2ad997bb46..a934fb615c 100644 --- a/source/libs/planner/test/planOtherTest.cpp +++ b/source/libs/planner/test/planOtherTest.cpp @@ -86,6 +86,8 @@ TEST_F(PlanOtherTest, show) { run("SHOW DNODE 1 VARIABLES"); run("SHOW TAGS FROM st1s1"); + + run("SHOW TABLE TAGS FROM st1"); } TEST_F(PlanOtherTest, delete) { From f1d492f62875468b4d22f004be0d569c419c004d Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Thu, 29 Sep 2022 16:18:47 +0800 Subject: [PATCH 079/143] doc: change rest connection sample as the default in tabs --- docs/en/14-reference/03-connector/04-java.mdx | 2 +- docs/en/14-reference/03-connector/05-go.mdx | 2 +- docs/en/14-reference/03-connector/06-rust.mdx | 22 ++++++++++--------- .../14-reference/03-connector/07-python.mdx | 2 +- docs/en/14-reference/03-connector/08-node.mdx | 4 ++-- docs/zh/08-connector/04-java.mdx | 2 +- docs/zh/08-connector/05-go.mdx | 2 +- docs/zh/08-connector/06-rust.mdx | 21 +++++++++--------- docs/zh/08-connector/07-python.mdx | 2 +- docs/zh/08-connector/08-node.mdx | 4 ++-- 10 files changed, 33 insertions(+), 30 deletions(-) diff --git a/docs/en/14-reference/03-connector/04-java.mdx b/docs/en/14-reference/03-connector/04-java.mdx index 0f977393f1..afa3200387 100644 --- a/docs/en/14-reference/03-connector/04-java.mdx +++ b/docs/en/14-reference/03-connector/04-java.mdx @@ -109,7 +109,7 @@ TDengine's JDBC URL specification format is: For establishing connections, native connections differ slightly from REST connections. - + ```java diff --git a/docs/en/14-reference/03-connector/05-go.mdx b/docs/en/14-reference/03-connector/05-go.mdx index 00e3bc1bc3..1bf99d72fa 100644 --- a/docs/en/14-reference/03-connector/05-go.mdx +++ b/docs/en/14-reference/03-connector/05-go.mdx @@ -113,7 +113,7 @@ username:password@protocol(address)/dbname?param=value ``` ### Connecting via connector - + _taosSql_ implements Go's `database/sql/driver` interface via cgo. You can use the [`database/sql`](https://golang.org/pkg/database/sql/) interface by simply introducing the driver. diff --git a/docs/en/14-reference/03-connector/06-rust.mdx b/docs/en/14-reference/03-connector/06-rust.mdx index 1184c98a28..9d2e840e9e 100644 --- a/docs/en/14-reference/03-connector/06-rust.mdx +++ b/docs/en/14-reference/03-connector/06-rust.mdx @@ -55,16 +55,6 @@ taos = "*" - - -In `cargo.toml`, add [taos][taos] and enable the native feature: - -```toml -[dependencies] -taos = { version = "*", default-features = false, features = ["native"] } -``` - - In `cargo.toml`, add [taos][taos] and enable the ws feature: @@ -75,6 +65,18 @@ taos = { version = "*", default-features = false, features = ["ws"] } ``` + + + +In `cargo.toml`, add [taos][taos] and enable the native feature: + +```toml +[dependencies] +taos = { version = "*", default-features = false, features = ["native"] } +``` + + + ## Establishing a connection diff --git a/docs/en/14-reference/03-connector/07-python.mdx b/docs/en/14-reference/03-connector/07-python.mdx index fc95033baa..355ba06ee4 100644 --- a/docs/en/14-reference/03-connector/07-python.mdx +++ b/docs/en/14-reference/03-connector/07-python.mdx @@ -81,7 +81,7 @@ pip3 install git+https://github.com/taosdata/taos-connector-python.git ### Verify - + For native connection, you need to verify that both the client driver and the Python connector itself are installed correctly. The client driver and Python connector have been installed properly if you can successfully import the `taos` module. In the Python Interactive Shell, you can type. diff --git a/docs/en/14-reference/03-connector/08-node.mdx b/docs/en/14-reference/03-connector/08-node.mdx index f93632b417..259ee590ef 100644 --- a/docs/en/14-reference/03-connector/08-node.mdx +++ b/docs/en/14-reference/03-connector/08-node.mdx @@ -85,7 +85,7 @@ If using ARM64 Node.js on Windows 10 ARM, you must add "Visual C++ compilers and ### Install via npm - + ```bash @@ -124,7 +124,7 @@ node nodejsChecker.js host=localhost Please choose to use one of the connectors. - + Install and import the `@tdengine/client` package. diff --git a/docs/zh/08-connector/04-java.mdx b/docs/zh/08-connector/04-java.mdx index 6b1715f8c6..d78da52aaa 100644 --- a/docs/zh/08-connector/04-java.mdx +++ b/docs/zh/08-connector/04-java.mdx @@ -109,7 +109,7 @@ TDengine 的 JDBC URL 规范格式为: 对于建立连接,原生连接与 REST 连接有细微不同。 - + ```java diff --git a/docs/zh/08-connector/05-go.mdx b/docs/zh/08-connector/05-go.mdx index 9d30f75190..515d1b030b 100644 --- a/docs/zh/08-connector/05-go.mdx +++ b/docs/zh/08-connector/05-go.mdx @@ -114,7 +114,7 @@ username:password@protocol(address)/dbname?param=value ``` ### 使用连接器进行连接 - + _taosSql_ 通过 cgo 实现了 Go 的 `database/sql/driver` 接口。只需要引入驱动就可以使用 [`database/sql`](https://golang.org/pkg/database/sql/) 的接口。 diff --git a/docs/zh/08-connector/06-rust.mdx b/docs/zh/08-connector/06-rust.mdx index 26f53c82d6..42cd5205cd 100644 --- a/docs/zh/08-connector/06-rust.mdx +++ b/docs/zh/08-connector/06-rust.mdx @@ -55,16 +55,6 @@ taos = "*" - - -在 `Cargo.toml` 文件中添加 [taos][taos],并启用 `native` 特性: - -```toml -[dependencies] -taos = { version = "*", default-features = false, features = ["native"] } -``` - - 在 `Cargo.toml` 文件中添加 [taos][taos],并启用 `ws` 特性。 @@ -74,6 +64,17 @@ taos = { version = "*", default-features = false, features = ["native"] } taos = { version = "*", default-features = false, features = ["ws"] } ``` + + + + +在 `Cargo.toml` 文件中添加 [taos][taos],并启用 `native` 特性: + +```toml +[dependencies] +taos = { version = "*", default-features = false, features = ["native"] } +``` + diff --git a/docs/zh/08-connector/07-python.mdx b/docs/zh/08-connector/07-python.mdx index 0242486d3b..2e80da4283 100644 --- a/docs/zh/08-connector/07-python.mdx +++ b/docs/zh/08-connector/07-python.mdx @@ -80,7 +80,7 @@ pip3 install git+https://github.com/taosdata/taos-connector-python.git ### 安装验证 - + 对于原生连接,需要验证客户端驱动和 Python 连接器本身是否都正确安装。如果能成功导入 `taos` 模块,则说明已经正确安装了客户端驱动和 Python 连接器。可在 Python 交互式 Shell 中输入: diff --git a/docs/zh/08-connector/08-node.mdx b/docs/zh/08-connector/08-node.mdx index 167ae069d6..1de19cdd3a 100644 --- a/docs/zh/08-connector/08-node.mdx +++ b/docs/zh/08-connector/08-node.mdx @@ -85,7 +85,7 @@ REST 连接器支持所有能运行 Node.js 的平台。 ### 使用 npm 安装 - + ```bash @@ -124,7 +124,7 @@ node nodejsChecker.js host=localhost 请选择使用一种连接器。 - + 安装并引用 `@tdengine/client` 包。 From 129f494e7ec03be1ada6a64ce3bade5688b0a017 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Thu, 29 Sep 2022 16:34:18 +0800 Subject: [PATCH 080/143] docs: add table name customization note (#17153) --- docs/en/20-third-party/03-telegraf.md | 20 +++++++++++++++----- docs/zh/20-third-party/03-telegraf.md | 20 +++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/docs/en/20-third-party/03-telegraf.md b/docs/en/20-third-party/03-telegraf.md index 6a7aac322f..e5c6d6f254 100644 --- a/docs/en/20-third-party/03-telegraf.md +++ b/docs/en/20-third-party/03-telegraf.md @@ -15,6 +15,7 @@ To write Telegraf data to TDengine requires the following preparations. - The TDengine cluster is deployed and functioning properly - taosAdapter is installed and running properly. Please refer to the [taosAdapter manual](/reference/taosadapter) for details. - Telegraf has been installed. Please refer to the [official documentation](https://docs.influxdata.com/telegraf/v1.22/install/) for Telegraf installation. +- Telegraf collects the running status measurements of current system. You can enable [input plugins](https://docs.influxdata.com/telegraf/v1.22/plugins/) to insert [other formats](https://docs.influxdata.com/telegraf/v1.24/data_formats/input/) data to Telegraf then forward to TDengine. ## Configuration steps @@ -31,11 +32,12 @@ Use TDengine CLI to verify Telegraf correctly writing data to TDengine and read ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - telegraf | 2022-04-20 08:47:53.488 | 22 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | - log | 2022-04-20 07:19:50.260 | 9 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | -Query OK, 2 row(s) in set (0.002401s) + name | +================================= + information_schema | + performance_schema | + telegraf | +Query OK, 3 rows in database (0.010568s) taos> use telegraf; Database changed. @@ -65,3 +67,11 @@ taos> select * from telegraf.system limit 10; | Query OK, 3 row(s) in set (0.013269s) ``` + +:::note + +- TDengine take influxdb format data and create unique ID for table names by the rule. +The user can configure `smlChildTableName` paramter to generate specified table names if he/she needs. And he/she also need to insert data with specified data format. +For example, Add `smlChildTableName=tname` in the taos.cfg file. Insert data `st,tname=cpu1,t1=4 c1=3 1626006833639000000` then the table name will be cpu1. If there are multiple lines has same tname but different tag_set, the first line's tag_set will be used to automatically creating table and ignore other lines. Please refer to [TDengine Schemaless](/reference/schemaless/#Schemaless-Line-Protocol) +::: + diff --git a/docs/zh/20-third-party/03-telegraf.md b/docs/zh/20-third-party/03-telegraf.md index 84883e665a..71bb1b3885 100644 --- a/docs/zh/20-third-party/03-telegraf.md +++ b/docs/zh/20-third-party/03-telegraf.md @@ -16,6 +16,7 @@ Telegraf 是一款十分流行的指标采集开源软件。在数据采集和 - TDengine 集群已经部署并正常运行 - taosAdapter 已经安装并正常运行。具体细节请参考 [taosAdapter 的使用手册](/reference/taosadapter) - Telegraf 已经安装。安装 Telegraf 请参考[官方文档](https://docs.influxdata.com/telegraf/v1.22/install/) +- Telegraf 默认采集系统运行状态数据。通过使能[输入插件](https://docs.influxdata.com/telegraf/v1.22/plugins/)方式可以输出[其他格式](https://docs.influxdata.com/telegraf/v1.24/data_formats/input/)的数据到 Telegraf 再写入到 TDengine中。 ## 配置步骤 @@ -32,11 +33,12 @@ sudo systemctl restart telegraf ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - telegraf | 2022-04-20 08:47:53.488 | 22 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | - log | 2022-04-20 07:19:50.260 | 9 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | -Query OK, 2 row(s) in set (0.002401s) + name | +================================= + information_schema | + performance_schema | + telegraf | +Query OK, 3 rows in database (0.010568s) taos> use telegraf; Database changed. @@ -66,3 +68,11 @@ taos> select * from telegraf.system limit 10; | Query OK, 3 row(s) in set (0.013269s) ``` + +:::note + +- TDengine 接收 influxdb 格式数据默认生成的子表名是根据规则生成的唯一 ID 值。 +用户如需指定生成的表名,可以通过在 taos.cfg 里配置 smlChildTableName 参数来指定。如果通过控制输入数据格式,即可利用 TDengine 这个功能指定生成的表名。 +举例如下:配置 smlChildTableName=tname 插入数据为 st,tname=cpu1,t1=4 c1=3 1626006833639000000 则创建的表名为 cpu1。如果多行数据 tname 相同,但是后面的 tag_set 不同,则使用第一行自动建表时指定的 tag_set,其他的行会忽略)。[TDengine 无模式写入参考指南](/reference/schemaless/#无模式写入行协议) +::: + From 363f062a85a7c23d2303ae28b08893bf85e08db1 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Thu, 29 Sep 2022 16:59:20 +0800 Subject: [PATCH 081/143] fix(query): fix tbname mismatch with multiple rows output functions when used with group by/partition by tbname. TD-19273 --- source/libs/executor/src/executorimpl.c | 8 ++++++++ source/libs/function/src/builtinsimpl.c | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 9917791312..8f76a3d72f 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1273,6 +1273,14 @@ static void doCopyResultToDataBlock(SExprInfo* pExprInfo, int32_t numOfExprs, SR pCtx[j].resultInfo = getResultEntryInfo(pRow, j, rowEntryOffset); if (pCtx[j].fpSet.finalize) { + if (strcmp(pCtx[j].pExpr->pExpr->_function.functionName, "_group_key") == 0) { + // for groupkey along with functions output multiple lines(e.g. Histogram) + // need to fill groupkey result for each output row. + if (pCtx[j].resultInfo->numOfRes != 0) { + pCtx[j].resultInfo->numOfRes = pRow->numOfRows; + } + } + int32_t code = pCtx[j].fpSet.finalize(&pCtx[j], pBlock); if (TAOS_FAILED(code)) { qError("%s build result data block error, code %s", GET_TASKID(pTaskInfo), tstrerror(code)); diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index a8d51905ab..42512d3a11 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -6157,7 +6157,10 @@ int32_t groupKeyFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { SGroupKeyInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo); if (pInfo->hasResult) { - colDataAppend(pCol, pBlock->info.rows, pInfo->data, pInfo->isNull ? true : false); + int32_t currentRow = pBlock->info.rows; + for (; currentRow < pBlock->info.rows + pResInfo->numOfRes; ++currentRow) { + colDataAppend(pCol, currentRow, pInfo->data, pInfo->isNull ? true : false); + } } else { pResInfo->numOfRes = 0; } From 075d8c4933b36145a17d2072dcc97c5dd6171555 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Thu, 29 Sep 2022 16:59:47 +0800 Subject: [PATCH 082/143] doc: change default tab to rest --- docs/zh/08-connector/30-python.mdx | 10 +++++----- docs/zh/08-connector/40-csharp.mdx | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/zh/08-connector/30-python.mdx b/docs/zh/08-connector/30-python.mdx index 2e80da4283..c70677f816 100644 --- a/docs/zh/08-connector/30-python.mdx +++ b/docs/zh/08-connector/30-python.mdx @@ -80,7 +80,7 @@ pip3 install git+https://github.com/taosdata/taos-connector-python.git ### 安装验证 - + 对于原生连接,需要验证客户端驱动和 Python 连接器本身是否都正确安装。如果能成功导入 `taos` 模块,则说明已经正确安装了客户端驱动和 Python 连接器。可在 Python 交互式 Shell 中输入: @@ -118,7 +118,7 @@ Requirement already satisfied: taospy in c:\users\username\appdata\local\program 在用连接器建立连接之前,建议先测试本地 TDengine CLI 到 TDengine 集群的连通性。 - + 请确保 TDengine 集群已经启动, 且集群中机器的 FQDN (如果启动的是单机版,FQDN 默认为 hostname)在本机能够解析, 可用 `ping` 命令进行测试: @@ -173,7 +173,7 @@ curl -u root:taosdata http://:/rest/sql -d "select server_version()" 以下示例代码假设 TDengine 安装在本机, 且 FQDN 和 serverPort 都使用了默认配置。 - + ```python @@ -219,7 +219,7 @@ curl -u root:taosdata http://:/rest/sql -d "select server_version()" ### 基本使用 - + ##### TaosConnection 类的使用 @@ -289,7 +289,7 @@ TaosCursor 类使用原生连接进行写入、查询操作。在客户端多线 ### 与 pandas 一起使用 - + ```python diff --git a/docs/zh/08-connector/40-csharp.mdx b/docs/zh/08-connector/40-csharp.mdx index e99f41ae9c..70c0382080 100644 --- a/docs/zh/08-connector/40-csharp.mdx +++ b/docs/zh/08-connector/40-csharp.mdx @@ -35,7 +35,7 @@ import CSAsyncQuery from "../07-develop/04-query-data/_cs_async.mdx" ## 支持的功能特性 - + @@ -96,7 +96,7 @@ dotnet add exmaple.csproj reference src/TDengine.csproj ## 建立连接 - + @@ -171,7 +171,7 @@ namespace TDengineExample #### SQL 写入 - + @@ -203,7 +203,7 @@ namespace TDengineExample #### 参数绑定 - + @@ -227,7 +227,7 @@ namespace TDengineExample #### 同步查询 - + From 3abf6abad6da88c71a7803bf6898146e40c77dcc Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Thu, 29 Sep 2022 16:59:20 +0800 Subject: [PATCH 083/143] fix(query): fix group_key output mismatch with multiple rows output functions TD-19273 --- source/libs/executor/src/executorimpl.c | 8 ++++++++ source/libs/function/src/builtinsimpl.c | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 9917791312..8f76a3d72f 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1273,6 +1273,14 @@ static void doCopyResultToDataBlock(SExprInfo* pExprInfo, int32_t numOfExprs, SR pCtx[j].resultInfo = getResultEntryInfo(pRow, j, rowEntryOffset); if (pCtx[j].fpSet.finalize) { + if (strcmp(pCtx[j].pExpr->pExpr->_function.functionName, "_group_key") == 0) { + // for groupkey along with functions output multiple lines(e.g. Histogram) + // need to fill groupkey result for each output row. + if (pCtx[j].resultInfo->numOfRes != 0) { + pCtx[j].resultInfo->numOfRes = pRow->numOfRows; + } + } + int32_t code = pCtx[j].fpSet.finalize(&pCtx[j], pBlock); if (TAOS_FAILED(code)) { qError("%s build result data block error, code %s", GET_TASKID(pTaskInfo), tstrerror(code)); diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index a8d51905ab..42512d3a11 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -6157,7 +6157,10 @@ int32_t groupKeyFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) { SGroupKeyInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo); if (pInfo->hasResult) { - colDataAppend(pCol, pBlock->info.rows, pInfo->data, pInfo->isNull ? true : false); + int32_t currentRow = pBlock->info.rows; + for (; currentRow < pBlock->info.rows + pResInfo->numOfRes; ++currentRow) { + colDataAppend(pCol, currentRow, pInfo->data, pInfo->isNull ? true : false); + } } else { pResInfo->numOfRes = 0; } From bdeb1ebcc5c18c376f78555a9dbf040fcbaddd33 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 29 Sep 2022 17:06:18 +0800 Subject: [PATCH 084/143] compare --- source/dnode/vnode/src/tsdb/tsdbCommit.c | 76 ++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 5 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 8992ee47c4..05e08b6bf4 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -17,6 +17,8 @@ typedef enum { MEMORY_DATA_ITER = 0, STT_DATA_ITER } EDataIterT; +#define USE_STREAM_COMPRESSION 1 + typedef struct { SRBTreeNode n; SRowInfo r; @@ -70,12 +72,16 @@ typedef struct { int8_t toLastOnly; }; struct { - SDataFWriter *pWriter; - SArray *aBlockIdx; // SArray - SArray *aSttBlk; // SArray - SMapData mBlock; // SMapData - SBlockData bData; + SDataFWriter *pWriter; + SArray *aBlockIdx; // SArray + SArray *aSttBlk; // SArray + SMapData mBlock; // SMapData + SBlockData bData; +#if USE_STREAM_COMPRESSION SDiskDataBuilder *pBuilder; +#else + SBlockData bDatal; +#endif } dWriter; SSkmInfo skmTable; SSkmInfo skmRow; @@ -542,7 +548,11 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) { taosArrayClear(pCommitter->dWriter.aSttBlk); tMapDataReset(&pCommitter->dWriter.mBlock); tBlockDataReset(&pCommitter->dWriter.bData); +#if USE_STREAM_COMPRESSION tDiskDataBuilderClear(pCommitter->dWriter.pBuilder); +#else + tBlockDataReset(&pCommitter->dWriter.bDatal); +#endif // open iter code = tsdbOpenCommitIter(pCommitter); @@ -860,7 +870,11 @@ static int32_t tsdbCommitDataStart(SCommitter *pCommitter) { code = tBlockDataCreate(&pCommitter->dWriter.bData); TSDB_CHECK_CODE(code, lino, _exit); +#if USE_STREAM_COMPRESSION code = tDiskDataBuilderCreate(&pCommitter->dWriter.pBuilder); +#else + code = tBlockDataCreate(&pCommitter->dWriter.bDatal); +#endif TSDB_CHECK_CODE(code, lino, _exit); _exit: @@ -889,7 +903,11 @@ static void tsdbCommitDataEnd(SCommitter *pCommitter) { taosArrayDestroy(pCommitter->dWriter.aSttBlk); tMapDataClear(&pCommitter->dWriter.mBlock); tBlockDataDestroy(&pCommitter->dWriter.bData, 1); +#if USE_STREAM_COMPRESSION tDiskDataBuilderDestroy(pCommitter->dWriter.pBuilder); +#else + tBlockDataDestroy(&pCommitter->dWriter.bDatal, 1); +#endif tTSchemaDestroy(pCommitter->skmTable.pTSchema); tTSchemaDestroy(pCommitter->skmRow.pTSchema); } @@ -1360,6 +1378,7 @@ static int32_t tsdbInitSttBlockBuilderIfNeed(SCommitter *pCommitter, TABLEID id) int32_t code = 0; int32_t lino = 0; +#if USE_STREAM_COMPRESSION SDiskDataBuilder *pBuilder = pCommitter->dWriter.pBuilder; if (pBuilder->suid || pBuilder->uid) { if (!TABLE_SAME_SCHEMA(pBuilder->suid, pBuilder->uid, id.suid, id.uid)) { @@ -1376,6 +1395,25 @@ static int32_t tsdbInitSttBlockBuilderIfNeed(SCommitter *pCommitter, TABLEID id) code = tDiskDataBuilderInit(pBuilder, pCommitter->skmTable.pTSchema, &id, pCommitter->cmprAlg, 0); TSDB_CHECK_CODE(code, lino, _exit); } +#else + SBlockData *pBData = &pCommitter->dWriter.bDatal; + if (pBData->suid || pBData->uid) { + if (!TABLE_SAME_SCHEMA(pBData->suid, pBData->uid, id.suid, id.uid)) { + code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBData, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg); + TSDB_CHECK_CODE(code, lino, _exit); + + tBlockDataReset(pBData); + } + } + + if (!pBData->suid && !pBData->uid) { + ASSERT(pCommitter->skmTable.suid == id.suid); + ASSERT(pCommitter->skmTable.uid == id.uid); + TABLEID tid = {.suid = id.suid, .uid = id.suid ? 0 : id.uid}; + code = tBlockDataInit(pBData, &tid, pCommitter->skmTable.pTSchema, NULL, 0); + TSDB_CHECK_CODE(code, lino, _exit); + } +#endif _exit: if (code) { @@ -1398,6 +1436,7 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { for (int32_t iRow = 0; iRow < pBData->nRow; iRow++) { TSDBROW row = tsdbRowFromBlockData(pBData, iRow); +#if USE_STREAM_COMPRESSION code = tDiskDataAddRow(pCommitter->dWriter.pBuilder, &row, NULL, &id); TSDB_CHECK_CODE(code, lino, _exit); @@ -1408,6 +1447,16 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) { code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id); TSDB_CHECK_CODE(code, lino, _exit); } +#else + code = tBlockDataAppendRow(&pCommitter->dWriter.bDatal, &row, NULL, id.uid); + TSDB_CHECK_CODE(code, lino, _exit); + + if (pCommitter->dWriter.bDatal.nRow >= pCommitter->maxRow) { + code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk, + pCommitter->cmprAlg); + TSDB_CHECK_CODE(code, lino, _exit); + } +#endif } _exit: @@ -1441,7 +1490,11 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { pTSchema = pCommitter->skmRow.pTSchema; } +#if USE_STREAM_COMPRESSION code = tDiskDataAddRow(pCommitter->dWriter.pBuilder, &pRowInfo->row, pTSchema, &id); +#else + code = tBlockDataAppendRow(&pCommitter->dWriter.bDatal, &pRowInfo->row, pTSchema, id.uid); +#endif TSDB_CHECK_CODE(code, lino, _exit); code = tsdbNextCommitRow(pCommitter); @@ -1452,6 +1505,7 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { pRowInfo = NULL; } +#if USE_STREAM_COMPRESSION if (pCommitter->dWriter.pBuilder->nRow >= pCommitter->maxRow) { code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk); TSDB_CHECK_CODE(code, lino, _exit); @@ -1459,6 +1513,13 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) { code = tsdbInitSttBlockBuilderIfNeed(pCommitter, id); TSDB_CHECK_CODE(code, lino, _exit); } +#else + if (pCommitter->dWriter.bData.nRow >= pCommitter->maxRow) { + code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk, + pCommitter->cmprAlg); + TSDB_CHECK_CODE(code, lino, _exit); + } +#endif } } else { SBlockData *pBData = &pCommitter->dWriter.bData; @@ -1561,7 +1622,12 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) { code = tsdbMoveCommitData(pCommitter, id); TSDB_CHECK_CODE(code, lino, _exit); +#if USE_STREAM_COMPRESSION code = tsdbCommitSttBlk(pCommitter->dWriter.pWriter, pCommitter->dWriter.pBuilder, pCommitter->dWriter.aSttBlk); +#else + code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk, + pCommitter->cmprAlg); +#endif TSDB_CHECK_CODE(code, lino, _exit); _exit: From 3af613ac7356fb4095058bd5603b2cd627f1d792 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Thu, 29 Sep 2022 17:04:31 +0800 Subject: [PATCH 085/143] Merge branch 'fix/TD-19273' of github.com:taosdata/TDengine into fix/TD-19273 --- source/libs/executor/src/executorimpl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 8f76a3d72f..ff28199712 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1274,8 +1274,8 @@ static void doCopyResultToDataBlock(SExprInfo* pExprInfo, int32_t numOfExprs, SR pCtx[j].resultInfo = getResultEntryInfo(pRow, j, rowEntryOffset); if (pCtx[j].fpSet.finalize) { if (strcmp(pCtx[j].pExpr->pExpr->_function.functionName, "_group_key") == 0) { - // for groupkey along with functions output multiple lines(e.g. Histogram) - // need to fill groupkey result for each output row. + // for groupkey along with functions that output multiple lines(e.g. Histogram) + // need to match groupkey result for each output row of that function. if (pCtx[j].resultInfo->numOfRes != 0) { pCtx[j].resultInfo->numOfRes = pRow->numOfRows; } From 19be38dcca8424bb18b8286f1d155398d647977c Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Thu, 29 Sep 2022 17:09:25 +0800 Subject: [PATCH 086/143] doc: change default to rest --- docs/en/14-reference/03-connector/07-python.mdx | 10 +++++----- docs/en/14-reference/03-connector/09-csharp.mdx | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/en/14-reference/03-connector/07-python.mdx b/docs/en/14-reference/03-connector/07-python.mdx index 5fdb42a2cd..304bab6e38 100644 --- a/docs/en/14-reference/03-connector/07-python.mdx +++ b/docs/en/14-reference/03-connector/07-python.mdx @@ -80,7 +80,7 @@ pip3 install git+https://github.com/taosdata/taos-connector-python.git ### Verify - + For native connection, you need to verify that both the client driver and the Python connector itself are installed correctly. The client driver and Python connector have been installed properly if you can successfully import the `taos` module. In the Python Interactive Shell, you can type. @@ -118,7 +118,7 @@ Requirement already satisfied: taospy in c:\users\username\appdata\local\program Before establishing a connection with the connector, we recommend testing the connectivity of the local TDengine CLI to the TDengine cluster. - + Ensure that the TDengine instance is up and that the FQDN of the machines in the cluster (the FQDN defaults to hostname if you are starting a standalone version) can be resolved locally, by testing with the `ping` command. @@ -173,7 +173,7 @@ If the test is successful, it will output the server version information, e.g. The following example code assumes that TDengine is installed locally and that the default configuration is used for both FQDN and serverPort. - + ```python @@ -219,7 +219,7 @@ All arguments to the `connect()` function are optional keyword arguments. The fo ### Basic Usage - + ##### TaosConnection class @@ -289,7 +289,7 @@ For a more detailed description of the `sql()` method, please refer to [RestClie ### Used with pandas - + ```python diff --git a/docs/en/14-reference/03-connector/09-csharp.mdx b/docs/en/14-reference/03-connector/09-csharp.mdx index 87a10e17ca..85514f58ac 100644 --- a/docs/en/14-reference/03-connector/09-csharp.mdx +++ b/docs/en/14-reference/03-connector/09-csharp.mdx @@ -97,7 +97,7 @@ dotnet add exmaple.csproj reference src/TDengine.csproj ## Establish a Connection - + @@ -173,7 +173,7 @@ ws://localhost:6041/test #### SQL Write - + @@ -204,7 +204,7 @@ ws://localhost:6041/test #### Parameter Binding - + @@ -227,7 +227,7 @@ ws://localhost:6041/test #### Synchronous Query - + From f90280ba95482a5a872ddc2da512fb8de4a1b89c Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Thu, 29 Sep 2022 17:09:51 +0800 Subject: [PATCH 087/143] docs: fix a typo in telegraf doc (#17155) * docs: add table name customization note * docs: fix a typo --- docs/en/20-third-party/03-telegraf.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/20-third-party/03-telegraf.md b/docs/en/20-third-party/03-telegraf.md index e5c6d6f254..ab06ab0379 100644 --- a/docs/en/20-third-party/03-telegraf.md +++ b/docs/en/20-third-party/03-telegraf.md @@ -71,7 +71,7 @@ Query OK, 3 row(s) in set (0.013269s) :::note - TDengine take influxdb format data and create unique ID for table names by the rule. -The user can configure `smlChildTableName` paramter to generate specified table names if he/she needs. And he/she also need to insert data with specified data format. +The user can configure `smlChildTableName` parameter to generate specified table names if he/she needs. And he/she also need to insert data with specified data format. For example, Add `smlChildTableName=tname` in the taos.cfg file. Insert data `st,tname=cpu1,t1=4 c1=3 1626006833639000000` then the table name will be cpu1. If there are multiple lines has same tname but different tag_set, the first line's tag_set will be used to automatically creating table and ignore other lines. Please refer to [TDengine Schemaless](/reference/schemaless/#Schemaless-Line-Protocol) ::: From 768a04d17155519a956ef7a0ea8e6293e56f7ed7 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Thu, 29 Sep 2022 17:14:47 +0800 Subject: [PATCH 088/143] doc: fix duplicate tabItem value --- docs/en/14-reference/03-connector/07-python.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/14-reference/03-connector/07-python.mdx b/docs/en/14-reference/03-connector/07-python.mdx index 304bab6e38..1e7945bfd2 100644 --- a/docs/en/14-reference/03-connector/07-python.mdx +++ b/docs/en/14-reference/03-connector/07-python.mdx @@ -81,7 +81,7 @@ pip3 install git+https://github.com/taosdata/taos-connector-python.git ### Verify - + For native connection, you need to verify that both the client driver and the Python connector itself are installed correctly. The client driver and Python connector have been installed properly if you can successfully import the `taos` module. In the Python Interactive Shell, you can type. From 59bb3d1475f61857d25dc7d4616fad37a3785b4c Mon Sep 17 00:00:00 2001 From: afwerar <1296468573@qq.com> Date: Thu, 29 Sep 2022 17:21:28 +0800 Subject: [PATCH 089/143] build: add websocket build --- docs/en/28-releases/01-tdengine.md | 4 ++++ docs/en/28-releases/02-tools.md | 4 ++++ docs/zh/28-releases/01-tdengine.md | 4 ++++ docs/zh/28-releases/02-tools.md | 4 ++++ packaging/release.sh | 4 ++-- 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/en/28-releases/01-tdengine.md b/docs/en/28-releases/01-tdengine.md index a65a2fff63..808a21474e 100644 --- a/docs/en/28-releases/01-tdengine.md +++ b/docs/en/28-releases/01-tdengine.md @@ -6,6 +6,10 @@ description: TDengine release history, Release Notes and download links. import Release from "/components/ReleaseV3"; +## 3.0.1.4 + + + ## 3.0.1.3 diff --git a/docs/en/28-releases/02-tools.md b/docs/en/28-releases/02-tools.md index a83723bff7..5d6693ae73 100644 --- a/docs/en/28-releases/02-tools.md +++ b/docs/en/28-releases/02-tools.md @@ -6,6 +6,10 @@ description: taosTools release history, Release Notes, download links. import Release from "/components/ReleaseV3"; +## 2.2.4 + + + ## 2.2.3 diff --git a/docs/zh/28-releases/01-tdengine.md b/docs/zh/28-releases/01-tdengine.md index 597e98238b..59e0d0f761 100644 --- a/docs/zh/28-releases/01-tdengine.md +++ b/docs/zh/28-releases/01-tdengine.md @@ -6,6 +6,10 @@ description: TDengine 发布历史、Release Notes 及下载链接 import Release from "/components/ReleaseV3"; +## 3.0.1.4 + + + ## 3.0.1.3 diff --git a/docs/zh/28-releases/02-tools.md b/docs/zh/28-releases/02-tools.md index 8604885d3c..83ccdec387 100644 --- a/docs/zh/28-releases/02-tools.md +++ b/docs/zh/28-releases/02-tools.md @@ -6,6 +6,10 @@ description: taosTools 的发布历史、Release Notes 和下载链接 import Release from "/components/ReleaseV3"; +## 2.2.4 + + + ## 2.2.3 diff --git a/packaging/release.sh b/packaging/release.sh index 2452ee1813..9ebbc50a84 100755 --- a/packaging/release.sh +++ b/packaging/release.sh @@ -219,12 +219,12 @@ fi if [[ "$cpuType" == "x64" ]] || [[ "$cpuType" == "aarch64" ]] || [[ "$cpuType" == "aarch32" ]] || [[ "$cpuType" == "arm64" ]] || [[ "$cpuType" == "arm32" ]] || [[ "$cpuType" == "mips64" ]]; then if [ "$verMode" != "cluster" ]; then # community-version compile - cmake ../ -DCPUTYPE=${cpuType} -DOSTYPE=${osType} -DSOMODE=${soMode} -DDBNAME=${dbName} -DVERTYPE=${verType} -DVERDATE="${build_time}" -DGITINFO=${gitinfo} -DGITINFOI=${gitinfoOfInternal} -DVERNUMBER=${verNumber} -DVERCOMPATIBLE=${verNumberComp} -DPAGMODE=${pagMode} -DBUILD_HTTP=${BUILD_HTTP} -DBUILD_TOOLS=${BUILD_TOOLS} ${allocator_macro} + cmake ../ -DCPUTYPE=${cpuType} -DWEBSOCKET=true -DOSTYPE=${osType} -DSOMODE=${soMode} -DDBNAME=${dbName} -DVERTYPE=${verType} -DVERDATE="${build_time}" -DGITINFO=${gitinfo} -DGITINFOI=${gitinfoOfInternal} -DVERNUMBER=${verNumber} -DVERCOMPATIBLE=${verNumberComp} -DPAGMODE=${pagMode} -DBUILD_HTTP=${BUILD_HTTP} -DBUILD_TOOLS=${BUILD_TOOLS} ${allocator_macro} else if [[ "$dbName" != "taos" ]]; then replace_enterprise_$dbName fi - cmake ../../ -DCPUTYPE=${cpuType} -DOSTYPE=${osType} -DSOMODE=${soMode} -DDBNAME=${dbName} -DVERTYPE=${verType} -DVERDATE="${build_time}" -DGITINFO=${gitinfo} -DGITINFOI=${gitinfoOfInternal} -DVERNUMBER=${verNumber} -DVERCOMPATIBLE=${verNumberComp} -DBUILD_HTTP=${BUILD_HTTP} -DBUILD_TOOLS=${BUILD_TOOLS} ${allocator_macro} + cmake ../../ -DCPUTYPE=${cpuType} -DWEBSOCKET=true -DOSTYPE=${osType} -DSOMODE=${soMode} -DDBNAME=${dbName} -DVERTYPE=${verType} -DVERDATE="${build_time}" -DGITINFO=${gitinfo} -DGITINFOI=${gitinfoOfInternal} -DVERNUMBER=${verNumber} -DVERCOMPATIBLE=${verNumberComp} -DBUILD_HTTP=${BUILD_HTTP} -DBUILD_TOOLS=${BUILD_TOOLS} ${allocator_macro} fi else echo "input cpuType=${cpuType} error!!!" From 61f92a24cbb8b60b13adf6ca77387d3426004e9c Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Thu, 29 Sep 2022 17:47:24 +0800 Subject: [PATCH 090/143] docs: add prometheus sub-table naming by rule note (#17158) --- docs/en/20-third-party/02-prometheus.md | 4 ++++ docs/zh/20-third-party/02-prometheus.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docs/en/20-third-party/02-prometheus.md b/docs/en/20-third-party/02-prometheus.md index 0fb41a1696..c46b0381b9 100644 --- a/docs/en/20-third-party/02-prometheus.md +++ b/docs/en/20-third-party/02-prometheus.md @@ -89,3 +89,7 @@ VALUE TIMESTAMP ``` +:::note + +- TDengine will automatically create unique IDs for sub-table names by the rule. +::: diff --git a/docs/zh/20-third-party/02-prometheus.md b/docs/zh/20-third-party/02-prometheus.md index eb6c3bf1d0..59bab1823a 100644 --- a/docs/zh/20-third-party/02-prometheus.md +++ b/docs/zh/20-third-party/02-prometheus.md @@ -88,3 +88,7 @@ VALUE TIMESTAMP ``` +:::note + +- TDengine 默认生成的子表名是根据规则生成的唯一 ID 值。 +::: From e8d2a30aa57ee212ec050cac9bafd06e6df9df30 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Thu, 29 Sep 2022 18:14:51 +0800 Subject: [PATCH 091/143] docs: add sub-table name by rule note (#17160) --- docs/en/20-third-party/05-collectd.md | 4 ++++ docs/zh/20-third-party/05-collectd.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docs/en/20-third-party/05-collectd.md b/docs/en/20-third-party/05-collectd.md index db62f2ecd1..295c08c307 100644 --- a/docs/en/20-third-party/05-collectd.md +++ b/docs/en/20-third-party/05-collectd.md @@ -72,3 +72,7 @@ taos> select * from collectd.memory_value limit 10; Query OK, 10 row(s) in set (0.010348s) ``` +:::note + +- TDengine will automatically create unique IDs for sub-table names by the rule. +::: diff --git a/docs/zh/20-third-party/05-collectd.md b/docs/zh/20-third-party/05-collectd.md index cc2235f260..d55b981fb9 100644 --- a/docs/zh/20-third-party/05-collectd.md +++ b/docs/zh/20-third-party/05-collectd.md @@ -72,3 +72,7 @@ taos> select * from collectd.memory_value limit 10; Query OK, 10 row(s) in set (0.010348s) ``` +:::note + +- TDengine 默认生成的子表名是根据规则生成的唯一 ID 值。 +::: From 4977e2e676f7daca2c4aba3ee8f2d88fbd7f6d8a Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Sep 2022 18:35:12 +0800 Subject: [PATCH 092/143] opt tbname in --- include/libs/index/index.h | 6 ++++ source/dnode/mgmt/node_mgmt/src/dmMgmt.c | 2 ++ source/libs/executor/src/executil.c | 40 ++++++++++++++++++++++-- source/libs/index/src/index.c | 12 +++++-- source/libs/index/src/indexCache.c | 2 +- source/libs/transport/src/transComm.c | 2 +- 6 files changed, 57 insertions(+), 7 deletions(-) diff --git a/include/libs/index/index.h b/include/libs/index/index.h index c1fdc4df52..a6e6373325 100644 --- a/include/libs/index/index.h +++ b/include/libs/index/index.h @@ -225,6 +225,12 @@ typedef enum { SFLT_NOT_INDEX, SFLT_COARSE_INDEX, SFLT_ACCURATE_INDEX } SIdxFltS SIdxFltStatus idxGetFltStatus(SNode* pFilterNode); int32_t doFilterTag(SNode* pFilterNode, SIndexMetaArg* metaArg, SArray* result, SIdxFltStatus* status); + +/* + * init index env + * + */ +void indexInit(int32_t threads); /* * destory index env * diff --git a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c index 582b16ce99..2e149be3b6 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c +++ b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c @@ -193,6 +193,8 @@ int32_t dmInitDnode(SDnode *pDnode, EDndNodeType rtype) { goto _OVER; } + indexInit(tsNumOfCommitThreads); + dmReportStartup("dnode-transport", "initialized"); dDebug("dnode is created, ptr:%p", pDnode); code = 0; diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 1ece2f902f..9da48dac86 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -27,6 +27,7 @@ #include "tcompression.h" static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond); +static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond); void initResultRowInfo(SResultRowInfo* pResultRowInfo) { pResultRowInfo->size = 0; @@ -750,7 +751,43 @@ end: return code; } -static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond) { +static int tableUidCompare(const void* a, const void* b) { + uint64_t u1 = *(uint64_t*)a; + uint64_t u2 = *(uint64_t*)b; + if (u1 == u2) { + return 0; + } + return u1 < u2 ? -1 : 1; +} +static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list, SNode* cond) { + if (nodeType(cond) == QUERY_NODE_OPERATOR) { + return optimizeTbnameInCondImpl(metaHandle, suid, list, cond); + } + + if (nodeType(cond) != QUERY_NODE_LOGIC_CONDITION || ((SLogicConditionNode*)cond)->condType != LOGIC_COND_TYPE_AND) { + return -1; + } + + SLogicConditionNode* pNode = (SLogicConditionNode*)cond; + SNodeListNode* pList = (SNodeListNode*)pNode->pParameterList; + int32_t len = LIST_LENGTH(pList->pNodeList); + + bool hasTbnameCond = false; + if (len <= 0) return -1; + + SListCell* cell = pList->pNodeList->pHead; + for (int i = 0; i < len; i++) { + if (cell && optimizeTbnameInCondImpl(metaHandle, suid, list, cell->pNode) == 0) { + hasTbnameCond = true; + } + cell = cell->pNext; + } + taosArraySort(list, tableUidCompare); + taosArrayRemoveDuplicate(list, tableUidCompare, NULL); + + return hasTbnameCond == true ? 0 : -1; +} +static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray* list, SNode* pTagCond) { if (nodeType(pTagCond) != QUERY_NODE_OPERATOR) { return -1; } @@ -777,7 +814,6 @@ static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list } char* name = varDataVal(valueNode->datum.p); taosArrayPush(pTbList, &name); - cell = cell->pNext; } diff --git a/source/libs/index/src/index.c b/source/libs/index/src/index.c index f507e1b3be..cb671cfff9 100644 --- a/source/libs/index/src/index.c +++ b/source/libs/index/src/index.c @@ -54,11 +54,17 @@ void* indexQhandle = NULL; int32_t indexRefMgt; +int32_t indexThreads = 5; + static void indexDestroy(void* sIdx); -void indexInit() { +void indexInit(int32_t threadNum) { + indexThreads = threadNum; + if (indexThreads <= 1) indexThreads = INDEX_NUM_OF_THREADS; +} +void indexEnvInit() { // refactor later - indexQhandle = taosInitScheduler(INDEX_QUEUE_SIZE, INDEX_NUM_OF_THREADS, "index", NULL); + indexQhandle = taosInitScheduler(INDEX_QUEUE_SIZE, indexThreads, "index", NULL); indexRefMgt = taosOpenRef(1000, indexDestroy); } void indexCleanup() { @@ -99,7 +105,7 @@ static void indexWait(void* idx) { int indexOpen(SIndexOpts* opts, const char* path, SIndex** index) { int ret = TSDB_CODE_SUCCESS; - taosThreadOnce(&isInit, indexInit); + taosThreadOnce(&isInit, indexEnvInit); SIndex* idx = taosMemoryCalloc(1, sizeof(SIndex)); if (idx == NULL) { return TSDB_CODE_OUT_OF_MEMORY; diff --git a/source/libs/index/src/indexCache.c b/source/libs/index/src/indexCache.c index 39bba4e269..72f693f7e5 100644 --- a/source/libs/index/src/indexCache.c +++ b/source/libs/index/src/indexCache.c @@ -22,7 +22,7 @@ #define MAX_INDEX_KEY_LEN 256 // test only, change later #define MEM_TERM_LIMIT 10 * 10000 -#define MEM_THRESHOLD 512 * 1024 +#define MEM_THRESHOLD 8 * 512 * 1024 // 8M #define MEM_SIGNAL_QUIT MEM_THRESHOLD * 20 #define MEM_ESTIMATE_RADIO 1.5 diff --git a/source/libs/transport/src/transComm.c b/source/libs/transport/src/transComm.c index 5f3171ee0e..ae9f3155b4 100644 --- a/source/libs/transport/src/transComm.c +++ b/source/libs/transport/src/transComm.c @@ -193,7 +193,7 @@ bool transReadComplete(SConnBuffer* connBuf) { int transSetConnOption(uv_tcp_t* stream) { uv_tcp_nodelay(stream, 1); - int ret = uv_tcp_keepalive(stream, 5, 5); + int ret = uv_tcp_keepalive(stream, 5, 60); return ret; } From 8aa5100dfd5a561d9581246a37b1785e60bfa094 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Thu, 29 Sep 2022 19:14:45 +0800 Subject: [PATCH 093/143] docs: icinga2 sub-tbname by rule note (#17161) --- docs/en/20-third-party/07-icinga2.md | 16 +++++++++++----- docs/zh/20-third-party/07-icinga2.md | 17 ++++++++++++----- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/docs/en/20-third-party/07-icinga2.md b/docs/en/20-third-party/07-icinga2.md index b27196dfe3..e98f209803 100644 --- a/docs/en/20-third-party/07-icinga2.md +++ b/docs/en/20-third-party/07-icinga2.md @@ -36,11 +36,12 @@ After waiting about 10 seconds, use the TDengine CLI to query TDengine to verify ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - log | 2022-04-20 07:19:50.260 | 11 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | - icinga2 | 2022-04-20 12:11:39.697 | 13 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | -Query OK, 2 row(s) in set (0.001867s) + name | +================================= + information_schema | + performance_schema | + icinga2 | +Query OK, 3 row(s) in set (0.001867s) taos> use icinga2; Database changed. @@ -72,3 +73,8 @@ taos> show stables; icinga.service.users.state | 2022-04-20 12:11:39.704 | 2 | 1 | 1 | Query OK, 22 row(s) in set (0.002317s) ``` + +:::note + +- TDengine will automatically create unique IDs for sub-table names by the rule. +::: diff --git a/docs/zh/20-third-party/07-icinga2.md b/docs/zh/20-third-party/07-icinga2.md index 06ead57655..03d733a326 100644 --- a/docs/zh/20-third-party/07-icinga2.md +++ b/docs/zh/20-third-party/07-icinga2.md @@ -37,11 +37,12 @@ sudo systemctl restart icinga2 ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - log | 2022-04-20 07:19:50.260 | 11 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | - icinga2 | 2022-04-20 12:11:39.697 | 13 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | -Query OK, 2 row(s) in set (0.001867s) + name | +================================= + information_schema | + performance_schema | + icinga2 | +Query OK, 3 row(s) in set (0.001867s) taos> use icinga2; Database changed. @@ -73,3 +74,9 @@ taos> show stables; icinga.service.users.state | 2022-04-20 12:11:39.704 | 2 | 1 | 1 | Query OK, 22 row(s) in set (0.002317s) ``` + + +:::note + +- TDengine 默认生成的子表名是根据规则生成的唯一 ID 值。 +::: From e94646ca704f4a91b059fb5adbf6c5c1d5b51b33 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 29 Sep 2022 19:41:54 +0800 Subject: [PATCH 094/143] fix: coverity issues --- include/libs/sync/sync.h | 2 +- source/dnode/mgmt/node_mgmt/src/dmProc.c | 3 +++ source/dnode/mgmt/node_mgmt/src/dmTransport.c | 2 +- source/dnode/mnode/impl/src/mndAcct.c | 1 + source/dnode/mnode/impl/src/mndCluster.c | 2 +- source/dnode/mnode/impl/src/mndSync.c | 17 +++++++++++------ source/dnode/mnode/impl/src/mndTopic.c | 2 +- source/dnode/mnode/impl/src/mndTrans.c | 6 ++++-- source/dnode/mnode/impl/src/mndUser.c | 1 + source/dnode/mnode/impl/src/mndVgroup.c | 8 ++++---- source/dnode/vnode/src/vnd/vnodeSync.c | 8 ++++---- source/libs/sync/src/syncMain.c | 2 +- .../sync/test/syncConfigChangeSnapshotTest.cpp | 4 ++-- source/libs/sync/test/syncConfigChangeTest.cpp | 4 ++-- source/libs/sync/test/syncTestTool.cpp | 4 ++-- 15 files changed, 39 insertions(+), 27 deletions(-) diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h index 285e079b3e..58c9b30890 100644 --- a/include/libs/sync/sync.h +++ b/include/libs/sync/sync.h @@ -132,7 +132,7 @@ typedef struct SSyncFSM { void (*FpRollBackCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta); void (*FpRestoreFinishCb)(struct SSyncFSM* pFsm); - void (*FpReConfigCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta cbMeta); + void (*FpReConfigCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta *cbMeta); void (*FpLeaderTransferCb)(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SFsmCbMeta cbMeta); void (*FpBecomeLeaderCb)(struct SSyncFSM* pFsm); diff --git a/source/dnode/mgmt/node_mgmt/src/dmProc.c b/source/dnode/mgmt/node_mgmt/src/dmProc.c index cbf13924d7..bb71044dd6 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmProc.c +++ b/source/dnode/mgmt/node_mgmt/src/dmProc.c @@ -74,11 +74,14 @@ static SProcQueue *dmInitProcQueue(SProc *proc, char *ptr, int32_t size) { } tstrncpy(queue->name, proc->name, sizeof(queue->name)); + + taosThreadMutexLock(&queue->mutex); queue->head = 0; queue->tail = 0; queue->total = bufSize; queue->avail = bufSize; queue->items = 0; + taosThreadMutexUnlock(&queue->mutex); } return queue; diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index f57943b9dd..e83f1f7cab 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -301,7 +301,7 @@ int32_t dmInitServer(SDnode *pDnode) { SDnodeTrans *pTrans = &pDnode->trans; SRpcInit rpcInit = {0}; - strncpy(rpcInit.localFqdn, tsLocalFqdn, TSDB_FQDN_LEN); + tstrncpy(rpcInit.localFqdn, tsLocalFqdn, TSDB_FQDN_LEN); rpcInit.localPort = tsServerPort; rpcInit.label = "DND-S"; rpcInit.numOfThreads = tsNumOfRpcThreads; diff --git a/source/dnode/mnode/impl/src/mndAcct.c b/source/dnode/mnode/impl/src/mndAcct.c index 5279a86d83..65857367f9 100644 --- a/source/dnode/mnode/impl/src/mndAcct.c +++ b/source/dnode/mnode/impl/src/mndAcct.c @@ -83,6 +83,7 @@ static int32_t mndCreateDefaultAcct(SMnode *pMnode) { STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, NULL, "create-acct"); if (pTrans == NULL) { + sdbFreeRaw(pRaw); mError("acct:%s, failed to create since %s", acctObj.acct, terrstr()); return -1; } diff --git a/source/dnode/mnode/impl/src/mndCluster.c b/source/dnode/mnode/impl/src/mndCluster.c index 70c9374821..96748b3620 100644 --- a/source/dnode/mnode/impl/src/mndCluster.c +++ b/source/dnode/mnode/impl/src/mndCluster.c @@ -315,7 +315,7 @@ static int32_t mndProcessUptimeTimer(SRpcMsg *pReq) { return 0; } - mInfo("update cluster uptime to %" PRId64, clusterObj.upTime); + mInfo("update cluster uptime to %d", clusterObj.upTime); STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "update-uptime"); if (pTrans == NULL) return -1; diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c index 3655289f99..aabde3fed2 100644 --- a/source/dnode/mnode/impl/src/mndSync.c +++ b/source/dnode/mnode/impl/src/mndSync.c @@ -68,7 +68,7 @@ void mndSyncCommitMsg(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbM if (pMgmt->errCode != 0) { mError("trans:%d, failed to propose since %s, post sem", transId, tstrerror(pMgmt->errCode)); } else { - mInfo("trans:%d, is proposed and post sem", transId, tstrerror(pMgmt->errCode)); + mInfo("trans:%d, is proposed and post sem", transId); } pMgmt->transId = 0; taosWUnLockLatch(&pMgmt->lock); @@ -113,13 +113,13 @@ void mndRestoreFinish(struct SSyncFSM *pFsm) { } } -void mndReConfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta cbMeta) { +void mndReConfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta *cbMeta) { SMnode *pMnode = pFsm->data; SSyncMgmt *pMgmt = &pMnode->syncMgmt; - pMgmt->errCode = cbMeta.code; + pMgmt->errCode = cbMeta->code; mInfo("trans:-1, sync reconfig is proposed, saved:%d code:0x%x, index:%" PRId64 " term:%" PRId64, pMgmt->transId, - cbMeta.code, cbMeta.index, cbMeta.term); + cbMeta->code, cbMeta->index, cbMeta->term); taosWLockLatch(&pMgmt->lock); if (pMgmt->transId == -1) { @@ -127,7 +127,7 @@ void mndReConfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta cbM mError("trans:-1, failed to propose sync reconfig since %s, post sem", tstrerror(pMgmt->errCode)); } else { mInfo("trans:-1, sync reconfig is proposed, saved:%d code:0x%x, index:%" PRId64 " term:%" PRId64 " post sem", - pMgmt->transId, cbMeta.code, cbMeta.index, cbMeta.term); + pMgmt->transId, cbMeta->code, cbMeta->index, cbMeta->term); } pMgmt->transId = 0; tsem_post(&pMgmt->syncSem); @@ -271,6 +271,11 @@ void mndCleanupSync(SMnode *pMnode) { int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) { SSyncMgmt *pMgmt = &pMnode->syncMgmt; SRpcMsg req = {.msgType = TDMT_MND_APPLY_MSG, .contLen = sdbGetRawTotalSize(pRaw)}; + if (req.contLen <= 0) { + terrno = TSDB_CODE_APP_ERROR; + return -1; + } + req.pCont = rpcMallocCont(req.contLen); if (req.pCont == NULL) return -1; memcpy(req.pCont, pRaw, req.contLen); @@ -278,7 +283,7 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) { pMgmt->errCode = 0; taosWLockLatch(&pMgmt->lock); if (pMgmt->transId != 0) { - mError("trans:%d, can't be proposed since trans:%s alrady waiting for confirm", transId, pMgmt->transId); + mError("trans:%d, can't be proposed since trans:%d alrady waiting for confirm", transId, pMgmt->transId); taosWUnLockLatch(&pMgmt->lock); terrno = TSDB_CODE_APP_NOT_READY; return -1; diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index b9647a28fb..662f524e08 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -774,7 +774,7 @@ static int32_t mndRetrieveTopic(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl SName n; int32_t cols = 0; - char topicName[TSDB_TOPIC_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + char topicName[TSDB_TOPIC_NAME_LEN + VARSTR_HEADER_SIZE + 5] = {0}; strcpy(varDataVal(topicName), mndGetDbStr(pTopic->name)); /*tNameFromString(&n, pTopic->name, T_NAME_ACCT | T_NAME_DB);*/ /*tNameGetDbName(&n, varDataVal(topicName));*/ diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 9613d924c4..455b71ace9 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -427,7 +427,7 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { terrno = 0; _OVER: - if (terrno != 0) { + if (terrno != 0 && pTrans != NULL) { mError("trans:%d, failed to parse from raw:%p since %s", pTrans->id, pRaw, terrstr()); mndTransDropData(pTrans); taosMemoryFreeClear(pRow); @@ -629,6 +629,7 @@ STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, ETrnConflct conflict, pTrans->pRpcArray == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; mError("failed to create transaction since %s", terrstr()); + mndTransDrop(pTrans); return NULL; } @@ -1428,6 +1429,7 @@ static bool mndTransPerfromFinishedStage(SMnode *pMnode, STrans *pTrans) { SSdbRaw *pRaw = mndTransActionEncode(pTrans); if (pRaw == NULL) { mError("trans:%d, failed to encode while finish trans since %s", pTrans->id, terrstr()); + return false; } sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); @@ -1617,7 +1619,7 @@ static int32_t mndRetrieveTrans(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl colDataAppend(pColInfo, numOfRows, (const char *)&pTrans->lastExecTime, false); char lastInfo[TSDB_TRANS_ERROR_LEN + VARSTR_HEADER_SIZE] = {0}; - char detail[TSDB_TRANS_ERROR_LEN] = {0}; + char detail[TSDB_TRANS_ERROR_LEN + 1] = {0}; int32_t len = snprintf(detail, sizeof(detail), "action:%d code:0x%x(%s) ", pTrans->lastAction, pTrans->lastErrorNo & 0xFFFF, tstrerror(pTrans->lastErrorNo)); SEpSet epset = pTrans->lastEpset; diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index 5512fa4107..fecdfb12ba 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -83,6 +83,7 @@ static int32_t mndCreateDefaultUser(SMnode *pMnode, char *acct, char *user, char STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, NULL, "create-user"); if (pTrans == NULL) { + sdbFreeRaw(pRaw); mError("user:%s, failed to create since %s", userObj.user, terrstr()); return -1; } diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index c1bc340819..a0f01f41d8 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -1250,7 +1250,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, mError("db:%s, vgId:%d, no enough memory:%" PRId64 " in dnode:%d avail:%" PRId64 " used:%" PRId64, pVgroup->dbName, pVgroup->vgId, vgMem, pNew1->id, pNew1->memAvail, pNew1->memUsed); terrno = TSDB_CODE_MND_NO_ENOUGH_MEM_IN_DNODE; - return -1; + goto _OVER; } else { pNew1->memUsed += vgMem; } @@ -1272,7 +1272,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, mError("db:%s, vgId:%d, no enough memory:%" PRId64 " in dnode:%d avail:%" PRId64 " used:%" PRId64, pVgroup->dbName, pVgroup->vgId, vgMem, pNew2->id, pNew2->memAvail, pNew2->memUsed); terrno = TSDB_CODE_MND_NO_ENOUGH_MEM_IN_DNODE; - return -1; + goto _OVER; } else { pNew2->memUsed += vgMem; } @@ -1293,7 +1293,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, mError("db:%s, vgId:%d, no enough memory:%" PRId64 " in dnode:%d avail:%" PRId64 " used:%" PRId64, pVgroup->dbName, pVgroup->vgId, vgMem, pNew3->id, pNew3->memAvail, pNew3->memUsed); terrno = TSDB_CODE_MND_NO_ENOUGH_MEM_IN_DNODE; - return -1; + goto _OVER; } else { pNew3->memUsed += vgMem; } @@ -1627,7 +1627,7 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj } else if (newVg1.replica == 3) { SVnodeGid del1 = {0}; if (mndRemoveVnodeFromVgroup(pMnode, &newVg1, pArray, &del1) != 0) goto _OVER; - if (mndAddSetVnodeStandByAction(pMnode, pTrans, pDb, pVgroup, &del1, true) != 0) return -1; + if (mndAddSetVnodeStandByAction(pMnode, pTrans, pDb, pVgroup, &del1, true) != 0) goto _OVER; if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVg1, TDMT_VND_ALTER_REPLICA) != 0) goto _OVER; if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVg1, &del1, true) != 0) goto _OVER; if (mndAddAlterVnodeConfirmAction(pMnode, pTrans, pDb, &newVg1) != 0) goto _OVER; diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index 2c3808a703..cdbdd4b468 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -496,16 +496,16 @@ static int32_t vnodeSyncGetSnapshot(SSyncFSM *pFsm, SSnapshot *pSnapshot) { return 0; } -static void vnodeSyncReconfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta cbMeta) { +static void vnodeSyncReconfig(struct SSyncFSM *pFsm, const SRpcMsg *pMsg, SReConfigCbMeta *cbMeta) { SVnode *pVnode = pFsm->data; SRpcMsg rpcMsg = {.msgType = pMsg->msgType, .contLen = pMsg->contLen}; - syncGetAndDelRespRpc(pVnode->sync, cbMeta.newCfgSeqNum, &rpcMsg.info); - rpcMsg.info.conn.applyIndex = cbMeta.index; + syncGetAndDelRespRpc(pVnode->sync, cbMeta->newCfgSeqNum, &rpcMsg.info); + rpcMsg.info.conn.applyIndex = cbMeta->index; const STraceId *trace = (STraceId *)&pMsg->info.traceId; vGTrace("vgId:%d, alter vnode replica is confirmed, type:%s contLen:%d seq:%" PRIu64 " handle:%p", TD_VID(pVnode), - TMSG_INFO(pMsg->msgType), pMsg->contLen, cbMeta.seqNum, rpcMsg.info.handle); + TMSG_INFO(pMsg->msgType), pMsg->contLen, cbMeta->seqNum, rpcMsg.info.handle); if (rpcMsg.info.handle != NULL) { tmsgSendRsp(&rpcMsg); } diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 17157fbd23..86c06c6936 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -2908,7 +2908,7 @@ static int32_t syncNodeConfigChangeFinish(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyn cbMeta.newCfgTerm = pFinish->newCfgTerm; cbMeta.newCfgSeqNum = pFinish->newCfgSeqNum; - ths->pFsm->FpReConfigCb(ths->pFsm, pRpcMsg, cbMeta); + ths->pFsm->FpReConfigCb(ths->pFsm, pRpcMsg, &cbMeta); } // clear changing diff --git a/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp b/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp index 714d233984..fbfc4cda8e 100644 --- a/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp +++ b/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp @@ -149,9 +149,9 @@ int32_t SnapshotDoWrite(struct SSyncFSM* pFsm, void* pWriter, void* pBuf, int32_ void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFinishCb=="); } -void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta cbMeta) { +void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta *cbMeta) { sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64, - cbMeta.flag, cbMeta.index, cbMeta.code, cbMeta.currentTerm, cbMeta.term); + cbMeta->flag, cbMeta->index, cbMeta->code, cbMeta->currentTerm, cbMeta->term); } SSyncFSM* createFsm() { diff --git a/source/libs/sync/test/syncConfigChangeTest.cpp b/source/libs/sync/test/syncConfigChangeTest.cpp index ba3fc77650..cfab3b6ae3 100644 --- a/source/libs/sync/test/syncConfigChangeTest.cpp +++ b/source/libs/sync/test/syncConfigChangeTest.cpp @@ -80,9 +80,9 @@ int32_t GetSnapshotCb(struct SSyncFSM* pFsm, SSnapshot* pSnapshot) { void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFinishCb=="); } -void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta cbMeta) { +void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta *cbMeta) { sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64, - cbMeta.flag, cbMeta.index, cbMeta.code, cbMeta.currentTerm, cbMeta.term); + cbMeta->flag, cbMeta->index, cbMeta->code, cbMeta->currentTerm, cbMeta->term); } SSyncFSM* createFsm() { diff --git a/source/libs/sync/test/syncTestTool.cpp b/source/libs/sync/test/syncTestTool.cpp index 9e9769224f..e718d37376 100644 --- a/source/libs/sync/test/syncTestTool.cpp +++ b/source/libs/sync/test/syncTestTool.cpp @@ -153,11 +153,11 @@ int32_t SnapshotDoWrite(struct SSyncFSM* pFsm, void* pWriter, void* pBuf, int32_ void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFinishCb== pFsm:%p", pFsm); } -void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta cbMeta) { +void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta* cbMeta) { char* s = syncCfg2Str(&(cbMeta.newCfg)); sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64 ", newCfg:%s", - cbMeta.flag, cbMeta.index, cbMeta.code, cbMeta.currentTerm, cbMeta.term, s); + cbMeta->flag, cbMeta->index, cbMeta->code, cbMeta->currentTerm, cbMeta->term, s); taosMemoryFree(s); } From 50478a31cc2789f8747146176d69d2935fbd36d9 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Sep 2022 20:30:32 +0800 Subject: [PATCH 095/143] opt tbname in --- source/libs/executor/src/executil.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 9da48dac86..887493a485 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -768,16 +768,17 @@ static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list return -1; } + bool hasTbnameCond = false; SLogicConditionNode* pNode = (SLogicConditionNode*)cond; SNodeListNode* pList = (SNodeListNode*)pNode->pParameterList; - int32_t len = LIST_LENGTH(pList->pNodeList); - bool hasTbnameCond = false; + int32_t len = LIST_LENGTH(pList->pNodeList); if (len <= 0) return -1; SListCell* cell = pList->pNodeList->pHead; for (int i = 0; i < len; i++) { - if (cell && optimizeTbnameInCondImpl(metaHandle, suid, list, cell->pNode) == 0) { + if (cell == NULL) break; + if (optimizeTbnameInCondImpl(metaHandle, suid, list, cell->pNode) == 0) { hasTbnameCond = true; } cell = cell->pNext; From 47234dfeecbb0edf87c2a35e75dc3cca0278b1ac Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Sep 2022 20:37:23 +0800 Subject: [PATCH 096/143] opt tbname in --- source/libs/executor/src/executil.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 887493a485..8679fa1297 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -420,7 +420,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray goto end; } } else { - qInfo("succ to get table from meta, suid:%" PRIu64, suid); + qInfo("succ to get table from meta idx, suid:%" PRIu64, suid); } int32_t rows = taosArrayGetSize(uidList); From 02310d59526f7a9bdb93f69ddd17fadb8058ca05 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Sep 2022 21:35:14 +0800 Subject: [PATCH 097/143] fix invalid read --- source/libs/executor/src/executil.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 8679fa1297..bd24dd0315 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -770,12 +770,12 @@ static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArray* list bool hasTbnameCond = false; SLogicConditionNode* pNode = (SLogicConditionNode*)cond; - SNodeListNode* pList = (SNodeListNode*)pNode->pParameterList; + SNodeList* pList = (SNodeList*)pNode->pParameterList; - int32_t len = LIST_LENGTH(pList->pNodeList); + int32_t len = LIST_LENGTH(pList); if (len <= 0) return -1; - SListCell* cell = pList->pNodeList->pHead; + SListCell* cell = pList->pHead; for (int i = 0; i < len; i++) { if (cell == NULL) break; if (optimizeTbnameInCondImpl(metaHandle, suid, list, cell->pNode) == 0) { From 1148ae8f6ea1ee6349ecaba642751c727676987a Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Sep 2022 21:53:39 +0800 Subject: [PATCH 098/143] opt tbname in --- source/libs/executor/src/executil.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index bd24dd0315..cdd2a2efad 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -829,8 +829,9 @@ static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray* } } taosArrayDestroy(pTbList); + return 0; } - return 0; + return -1; } int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, SNode* pTagIndexCond, STableListInfo* pListInfo) { From d74779805abb301e71e4d99abff845b377eb0ff4 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Sep 2022 23:13:54 +0800 Subject: [PATCH 099/143] opt tbname in --- source/dnode/vnode/inc/vnode.h | 1 + source/dnode/vnode/src/meta/metaQuery.c | 14 ++++++++++++++ source/libs/executor/src/executil.c | 1 + 3 files changed, 16 insertions(+) diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 35ea512f81..c37cecc06d 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -95,6 +95,7 @@ void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags); void metaReaderClear(SMetaReader *pReader); int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid); int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags); +int32_t metaGetTableTagsOpt(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags); int32_t metaReadNext(SMetaReader *pReader); const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal); int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName); diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 7ddcd20d22..a20bae8a2d 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -1122,6 +1122,20 @@ END: return ret; } +int32_t metaGetTableTagsOpt(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) { + int32_t sz = uidList ? taosArrayGetSize(uidList) : 0; + for (int i = 0; i < sz; i++) { + tb_uid_t *id = taosArrayGet(uidList, i); + SCtbIdxKey ctbIdxKey = {.suid = suid, .uid = *id}; + + void *val = NULL; + int32_t len = 0; + if (0 == tdbTbGet(pMeta->pCtbIdx, &ctbIdxKey, sizeof(SCtbIdxKey), &val, &len)) { + taosHashPut(tags, id, sizeof(tb_uid_t), val, len); + } + } + return 0; +} int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) { SMCtbCursor *pCur = metaOpenCtbCursor(pMeta, suid); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index cdd2a2efad..82ee6265f8 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -420,6 +420,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray goto end; } } else { + metaGetTableTagsOpt(metaHandle, suid, uidList, tags); qInfo("succ to get table from meta idx, suid:%" PRIu64, suid); } From 6445ee8ad6d6ff84e8ef34c32da072fbee534860 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Sep 2022 23:56:07 +0800 Subject: [PATCH 100/143] opt tbname in --- include/libs/index/index.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/include/libs/index/index.h b/include/libs/index/index.h index a6e6373325..0d31ca2f68 100644 --- a/include/libs/index/index.h +++ b/include/libs/index/index.h @@ -206,12 +206,6 @@ void indexJsonRebuild(SIndexJson* idx, void* iter); **/ bool indexJsonIsRebuild(SIndexJson* idx); -/* - * init index env - * - */ -void indexInit(); - /* index filter */ typedef struct SIndexMetaArg { void* metaEx; From 0d3da109543ec988aa0f732e7a679dc8c1dcd4c1 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 30 Sep 2022 09:31:19 +0800 Subject: [PATCH 101/143] fix invalid read --- source/dnode/vnode/inc/vnode.h | 1 + source/dnode/vnode/src/meta/metaQuery.c | 15 ++++++++++++++- source/libs/executor/src/executil.c | 8 +++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index c37cecc06d..2cc22a4298 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -100,6 +100,7 @@ int32_t metaReadNext(SMetaReader *pReader); const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal); int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName); int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid); +int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType); bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid); typedef struct SMetaFltParam { diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index a20bae8a2d..d499db4958 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -223,6 +223,18 @@ int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid) { return 0; } +int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType) { + int code = 0; + SMetaReader mr = {0}; + metaReaderInit(&mr, (SMeta *)meta, 0); + + if (metaGetTableEntryByName(&mr, tbName) == 0) { + *tbType = mr.me.type; + } + metaReaderClear(&mr); + return 0; +} + int metaReadNext(SMetaReader *pReader) { SMeta *pMeta = pReader->pMeta; @@ -1130,7 +1142,8 @@ int32_t metaGetTableTagsOpt(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashO void *val = NULL; int32_t len = 0; - if (0 == tdbTbGet(pMeta->pCtbIdx, &ctbIdxKey, sizeof(SCtbIdxKey), &val, &len)) { + if (taosHashGet(tags, id, sizeof(tb_uid_t)) == NULL && + 0 == tdbTbGet(pMeta->pCtbIdx, &ctbIdxKey, sizeof(SCtbIdxKey), &val, &len)) { taosHashPut(tags, id, sizeof(tb_uid_t), val, len); } } diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 82ee6265f8..38304bcc76 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -823,7 +823,13 @@ static int32_t optimizeTbnameInCondImpl(void* metaHandle, int64_t suid, SArray* char* name = taosArrayGetP(pTbList, i); uint64_t uid = 0; if (metaGetTableUidByName(metaHandle, name, &uid) == 0) { - taosArrayPush(list, &uid); + ETableType tbType = TSDB_TABLE_MAX; + if (metaGetTableTypeByName(metaHandle, name, &tbType) == 0 && tbType == TSDB_CHILD_TABLE) { + taosArrayPush(list, &uid); + } else { + taosArrayDestroy(pTbList); + return -1; + } } else { qWarn("failed to get tableIds from by table name: %s, reason: %s", name, tstrerror(terrno)); terrno = 0; From 46c99915bc7ebc106394ce8e833df3966eb3ae29 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao@163.com> Date: Thu, 29 Sep 2022 18:52:11 +0800 Subject: [PATCH 102/143] feat(stream): distribute interval disc buff --- include/libs/stream/streamState.h | 8 +- source/libs/executor/inc/executil.h | 28 +- source/libs/executor/inc/executorimpl.h | 50 +- source/libs/executor/src/executorimpl.c | 28 +- source/libs/executor/src/scanoperator.c | 6 +- source/libs/executor/src/tfill.c | 4 +- source/libs/executor/src/timewindowoperator.c | 745 +++++++----------- source/libs/stream/src/streamState.c | 132 +++- .../tsim/stream/distributeInterval0.sim | 3 +- 9 files changed, 478 insertions(+), 526 deletions(-) diff --git a/include/libs/stream/streamState.h b/include/libs/stream/streamState.h index 0adcf976f0..c2b3a7977c 100644 --- a/include/libs/stream/streamState.h +++ b/include/libs/stream/streamState.h @@ -33,6 +33,7 @@ typedef struct { TTB* pFuncStateDb; TTB* pFillStateDb; // todo refactor TXN txn; + int32_t number; } SStreamState; SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath); @@ -42,7 +43,8 @@ int32_t streamStateCommit(SStreamState* pState); int32_t streamStateAbort(SStreamState* pState); typedef struct { - TBC* pCur; + TBC* pCur; + int64_t number; } SStreamStateCur; int32_t streamStateFuncPut(SStreamState* pState, const STupleKey* key, const void* value, int32_t vLen); @@ -52,6 +54,8 @@ int32_t streamStateFuncDel(SStreamState* pState, const STupleKey* key); int32_t streamStatePut(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen); int32_t streamStateGet(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen); int32_t streamStateDel(SStreamState* pState, const SWinKey* key); +int32_t streamStateClear(SStreamState* pState); +void streamStateSetNumber(SStreamState* pState, int32_t number); int32_t streamStateFillPut(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen); int32_t streamStateFillGet(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen); @@ -63,6 +67,7 @@ void streamFreeVal(void* val); SStreamStateCur* streamStateGetCur(SStreamState* pState, const SWinKey* key); SStreamStateCur* streamStateGetAndCheckCur(SStreamState* pState, SWinKey* key); +SStreamStateCur* streamStateSeekKeyNext(SStreamState* pState, const SWinKey* key); SStreamStateCur* streamStateFillSeekKeyNext(SStreamState* pState, const SWinKey* key); SStreamStateCur* streamStateFillSeekKeyPrev(SStreamState* pState, const SWinKey* key); void streamStateFreeCur(SStreamStateCur* pCur); @@ -70,6 +75,7 @@ void streamStateFreeCur(SStreamStateCur* pCur); int32_t streamStateGetGroupKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen); int32_t streamStateGetKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen); +int32_t streamStateGetFirst(SStreamState* pState, SWinKey* key); int32_t streamStateSeekFirst(SStreamState* pState, SStreamStateCur* pCur); int32_t streamStateSeekLast(SStreamState* pState, SStreamStateCur* pCur); diff --git a/source/libs/executor/inc/executil.h b/source/libs/executor/inc/executil.h index baf7d447cc..9dba29811e 100644 --- a/source/libs/executor/inc/executil.h +++ b/source/libs/executor/inc/executil.h @@ -15,7 +15,6 @@ #ifndef TDENGINE_QUERYUTIL_H #define TDENGINE_QUERYUTIL_H -#include "vnode.h" #include "function.h" #include "nodes.h" #include "plannodes.h" @@ -23,6 +22,7 @@ #include "tcommon.h" #include "tpagedbuf.h" #include "tsimplehash.h" +#include "vnode.h" #define T_LONG_JMP(_obj, _c) \ do { \ @@ -93,7 +93,7 @@ void resetResultRow(SResultRow* pResultRow, size_t entrySize); struct SResultRowEntryInfo* getResultEntryInfo(const SResultRow* pRow, int32_t index, const int32_t* offset); static FORCE_INLINE SResultRow* getResultRowByPos(SDiskbasedBuf* pBuf, SResultRowPosition* pos, bool forUpdate) { - SFilePage* bufPage = (SFilePage*)getBufPage(pBuf, pos->pageId); + SFilePage* bufPage = (SFilePage*)getBufPage(pBuf, pos->pageId); if (forUpdate) { setBufPageDirty(bufPage, true); } @@ -101,11 +101,6 @@ static FORCE_INLINE SResultRow* getResultRowByPos(SDiskbasedBuf* pBuf, SResultRo return pRow; } -static FORCE_INLINE void setResultBufPageDirty(SDiskbasedBuf* pBuf, SResultRowPosition* pos) { - void* pPage = getBufPage(pBuf, pos->pageId); - setBufPageDirty(pPage, true); -} - void initGroupedResultInfo(SGroupResInfo* pGroupResInfo, SSHashObj* pHashmap, int32_t order); void cleanupGroupResInfo(SGroupResInfo* pGroupResInfo); @@ -117,17 +112,18 @@ int32_t getNumOfTotalRes(SGroupResInfo* pGroupResInfo); SSDataBlock* createResDataBlock(SDataBlockDescNode* pNode); EDealRes doTranslateTagExpr(SNode** pNode, void* pContext); -int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, SNode* pTagIndexCond, STableListInfo* pListInfo); -int32_t getGroupIdFromTagsVal(void* pMeta, uint64_t uid, SNodeList* pGroupNode, char* keyBuf, uint64_t* pGroupId); -int32_t getColInfoResultForGroupby(void* metaHandle, SNodeList* group, STableListInfo* pTableListInfo); -size_t getTableTagsBufLen(const SNodeList* pGroups); +int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, SNode* pTagIndexCond, + STableListInfo* pListInfo); +int32_t getGroupIdFromTagsVal(void* pMeta, uint64_t uid, SNodeList* pGroupNode, char* keyBuf, uint64_t* pGroupId); +int32_t getColInfoResultForGroupby(void* metaHandle, SNodeList* group, STableListInfo* pTableListInfo); +size_t getTableTagsBufLen(const SNodeList* pGroups); -SArray* createSortInfo(SNodeList* pNodeList); -SArray* extractPartitionColInfo(SNodeList* pNodeList); -SArray* extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNodeList, int32_t* numOfOutputCols, - int32_t type); +SArray* createSortInfo(SNodeList* pNodeList); +SArray* extractPartitionColInfo(SNodeList* pNodeList); +SArray* extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNodeList, int32_t* numOfOutputCols, + int32_t type); -void createExprFromTargetNode(SExprInfo* pExp, STargetNode* pTargetNode); +void createExprFromTargetNode(SExprInfo* pExp, STargetNode* pTargetNode); SExprInfo* createExprInfo(SNodeList* pNodeList, SNodeList* pGroupKeys, int32_t* numOfExprs); SqlFunctionCtx* createSqlFunctionCtx(SExprInfo* pExprInfo, int32_t numOfOutput, int32_t** rowEntryInfoOffset); diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index 56470f0668..897015c4d3 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -577,13 +577,7 @@ typedef struct SIntervalAggOperatorInfo { int32_t inputOrder; // input data ts order EOPTR_EXEC_MODEL execModel; // operator execution model [batch model|stream model] STimeWindowAggSupp twAggSup; - bool invertible; SArray* pPrevValues; // SArray used to keep the previous not null value for interpolation. - bool ignoreExpiredData; - SArray* pRecycledPages; - SArray* pDelWins; // SWinRes - int32_t delIndex; - SSDataBlock* pDelRes; SNode* pCondition; } SIntervalAggOperatorInfo; @@ -609,38 +603,21 @@ typedef struct SStreamIntervalOperatorInfo { STimeWindowAggSupp twAggSup; bool invertible; bool ignoreExpiredData; - SArray* pRecycledPages; SArray* pDelWins; // SWinRes int32_t delIndex; SSDataBlock* pDelRes; - bool isFinal; -} SStreamIntervalOperatorInfo; - -typedef struct SStreamFinalIntervalOperatorInfo { - // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode - SOptrBasicInfo binfo; // basic info - SAggSupporter aggSup; // aggregate supporter - SExprSupp scalarSupp; // supporter for perform scalar function - SGroupResInfo groupResInfo; // multiple results build supporter - SInterval interval; // interval info - int32_t primaryTsIndex; // primary time stamp slot id from result of downstream operator. - int32_t order; // current SSDataBlock scan order - STimeWindowAggSupp twAggSup; - SArray* pChildren; SSDataBlock* pUpdateRes; bool returnUpdate; - SPhysiNode* pPhyNode; // create new child - bool isFinal; + SPhysiNode* pPhyNode; // create new child SHashObj* pPullDataMap; - SArray* pPullWins; // SPullWindowInfo + SArray* pPullWins; // SPullWindowInfo int32_t pullIndex; SSDataBlock* pPullDataRes; - bool ignoreExpiredData; - SArray* pRecycledPages; - SArray* pDelWins; // SWinRes - int32_t delIndex; - SSDataBlock* pDelRes; -} SStreamFinalIntervalOperatorInfo; + bool isFinal; + SArray* pChildren; + SStreamState* pState; + SWinKey delKey; +} SStreamIntervalOperatorInfo; typedef struct SAggOperatorInfo { // SOptrBasicInfo should be first, SAggSupporter should be second for stream encode @@ -1086,7 +1063,7 @@ bool functionNeedToExecute(SqlFunctionCtx* pCtx); bool isOverdue(TSKEY ts, STimeWindowAggSupp* pSup); bool isCloseWindow(STimeWindow* pWin, STimeWindowAggSupp* pSup); bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup); -bool isDeletedStreamWindow(STimeWindow* pWin, uint64_t groupId, SOperatorInfo* pOperator, STimeWindowAggSupp* pTwSup); +bool isDeletedStreamWindow(STimeWindow* pWin, uint64_t groupId, SStreamState* pState, STimeWindowAggSupp* pTwSup); void appendOneRow(SSDataBlock* pBlock, TSKEY* pStartTs, TSKEY* pEndTs, uint64_t* pUid, uint64_t* pGp); void printDataBlock(SSDataBlock* pBlock, const char* flag); uint64_t calGroupIdByData(SPartitionBySupporter* pParSup, SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t rowId); @@ -1108,13 +1085,12 @@ void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsCol bool groupbyTbname(SNodeList* pGroupList); int32_t generateGroupIdMap(STableListInfo* pTableListInfo, SReadHandle* pHandle, SNodeList* groupKey); void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput); -int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprSupp* pSup, +int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SStreamState* pState, SSDataBlock* pBlock, SExprSupp* pSup, SGroupResInfo* pGroupResInfo); -int32_t setOutputBuf(STimeWindow* win, SResultRow** pResult, int64_t tableGroupId, SqlFunctionCtx* pCtx, - int32_t numOfOutput, int32_t* rowEntryInfoOffset, SAggSupporter* pAggSup, - SExecTaskInfo* pTaskInfo); -int32_t releaseOutputBuf(SExecTaskInfo* pTaskInfo, SWinKey* pKey, SResultRow* pResult); -int32_t saveOutputBuf(SExecTaskInfo* pTaskInfo, SWinKey* pKey, SResultRow* pResult, int32_t resSize); +int32_t setOutputBuf(SStreamState* pState, STimeWindow* win, SResultRow** pResult, int64_t tableGroupId, SqlFunctionCtx* pCtx, + int32_t numOfOutput, int32_t* rowEntryInfoOffset, SAggSupporter* pAggSup); +int32_t releaseOutputBuf(SStreamState* pState, SWinKey* pKey, SResultRow* pResult); +int32_t saveOutputBuf(SStreamState* pState, SWinKey* pKey, SResultRow* pResult, int32_t resSize); void getNextIntervalWindow(SInterval* pInterval, STimeWindow* tw, int32_t order); #ifdef __cplusplus diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index ff28199712..5db55b02f8 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -4183,9 +4183,8 @@ int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, const char* pKey, SqlF return code; } -int32_t setOutputBuf(STimeWindow* win, SResultRow** pResult, int64_t tableGroupId, SqlFunctionCtx* pCtx, - int32_t numOfOutput, int32_t* rowEntryInfoOffset, SAggSupporter* pAggSup, - SExecTaskInfo* pTaskInfo) { +int32_t setOutputBuf(SStreamState* pState, STimeWindow* win, SResultRow** pResult, int64_t tableGroupId, + SqlFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowEntryInfoOffset, SAggSupporter* pAggSup) { SWinKey key = { .ts = win->skey, .groupId = tableGroupId, @@ -4194,7 +4193,7 @@ int32_t setOutputBuf(STimeWindow* win, SResultRow** pResult, int64_t tableGroupI int32_t size = pAggSup->resultRowSize; tSimpleHashPut(pAggSup->pResultRowHashTable, &key, sizeof(SWinKey), NULL, 0); - if (streamStateAddIfNotExist(pTaskInfo->streamInfo.pState, &key, (void**)&value, &size) < 0) { + if (streamStateAddIfNotExist(pState, &key, (void**)&value, &size) < 0) { return TSDB_CODE_QRY_OUT_OF_MEMORY; } *pResult = (SResultRow*)value; @@ -4205,18 +4204,17 @@ int32_t setOutputBuf(STimeWindow* win, SResultRow** pResult, int64_t tableGroupI return TSDB_CODE_SUCCESS; } -int32_t releaseOutputBuf(SExecTaskInfo* pTaskInfo, SWinKey* pKey, SResultRow* pResult) { - streamStateReleaseBuf(pTaskInfo->streamInfo.pState, pKey, pResult); - /*taosMemoryFree((*(void**)pResult));*/ +int32_t releaseOutputBuf(SStreamState* pState, SWinKey* pKey, SResultRow* pResult) { + streamStateReleaseBuf(pState, pKey, pResult); return TSDB_CODE_SUCCESS; } -int32_t saveOutputBuf(SExecTaskInfo* pTaskInfo, SWinKey* pKey, SResultRow* pResult, int32_t resSize) { - streamStatePut(pTaskInfo->streamInfo.pState, pKey, pResult, resSize); +int32_t saveOutputBuf(SStreamState* pState, SWinKey* pKey, SResultRow* pResult, int32_t resSize) { + streamStatePut(pState, pKey, pResult, resSize); return TSDB_CODE_SUCCESS; } -int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprSupp* pSup, +int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SStreamState* pState, SSDataBlock* pBlock, SExprSupp* pSup, SGroupResInfo* pGroupResInfo) { SExprInfo* pExprInfo = pSup->pExprInfo; int32_t numOfExprs = pSup->numOfExprs; @@ -4233,14 +4231,14 @@ int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock .ts = *(TSKEY*)pPos->key, .groupId = pPos->groupId, }; - int32_t code = streamStateGet(pTaskInfo->streamInfo.pState, &key, &pVal, &size); + int32_t code = streamStateGet(pState, &key, &pVal, &size); ASSERT(code == 0); SResultRow* pRow = (SResultRow*)pVal; doUpdateNumOfRows(pCtx, pRow, numOfExprs, rowEntryOffset); // no results, continue to check the next one if (pRow->numOfRows == 0) { pGroupResInfo->index += 1; - releaseOutputBuf(pTaskInfo, &key, pRow); + releaseOutputBuf(pState, &key, pRow); continue; } @@ -4249,14 +4247,14 @@ int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock } else { // current value belongs to different group, it can't be packed into one datablock if (pBlock->info.groupId != pPos->groupId) { - releaseOutputBuf(pTaskInfo, &key, pRow); + releaseOutputBuf(pState, &key, pRow); break; } } if (pBlock->info.rows + pRow->numOfRows > pBlock->info.capacity) { ASSERT(pBlock->info.rows > 0); - releaseOutputBuf(pTaskInfo, &key, pRow); + releaseOutputBuf(pState, &key, pRow); break; } @@ -4286,7 +4284,7 @@ int32_t buildDataBlockFromGroupRes(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock } pBlock->info.rows += pRow->numOfRows; - releaseOutputBuf(pTaskInfo, &key, pRow); + releaseOutputBuf(pState, &key, pRow); } blockDataUpdateTsWindow(pBlock, 0); return TSDB_CODE_SUCCESS; diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 9694ccadb7..40fc8cb9a5 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1357,7 +1357,8 @@ static void checkUpdateData(SStreamScanInfo* pInfo, bool invertible, SSDataBlock // must check update info first. bool update = updateInfoIsUpdated(pInfo->pUpdateInfo, pBlock->info.uid, tsCol[rowId]); bool closedWin = isClosed && isSignleIntervalWindow(pInfo) && - isDeletedStreamWindow(&win, pBlock->info.groupId, pInfo->pTableScanOp, &pInfo->twAggSup); + isDeletedStreamWindow(&win, pBlock->info.groupId, + pInfo->pTableScanOp->pTaskInfo->streamInfo.pState, &pInfo->twAggSup); if ((update || closedWin) && out) { qDebug("stream update check not pass, update %d, closedWin %d", update, closedWin); uint64_t gpId = 0; @@ -2135,6 +2136,9 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys pInfo->pUpdateInfo = NULL; pInfo->pTableScanOp = pTableScanOp; + if (pInfo->pTableScanOp->pTaskInfo->streamInfo.pState) { + streamStateSetNumber(pInfo->pTableScanOp->pTaskInfo->streamInfo.pState, -1); + } pInfo->readHandle = *pHandle; pInfo->tableUid = pScanPhyNode->uid; diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c index ea0d26f4de..f6fd8c8920 100644 --- a/source/libs/executor/src/tfill.c +++ b/source/libs/executor/src/tfill.c @@ -1620,9 +1620,7 @@ SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFi goto _error; } - SInterval* pInterval = QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL == downstream->operatorType - ? &((SStreamFinalIntervalOperatorInfo*)downstream->info)->interval - : &((SStreamIntervalOperatorInfo*)downstream->info)->interval; + SInterval* pInterval = &((SStreamIntervalOperatorInfo*)downstream->info)->interval; int32_t numOfFillCols = 0; SExprInfo* pFillExprInfo = createExprInfo(pPhyFillNode->pFillExprs, NULL, &numOfFillCols); pInfo->pFillSup = initStreamFillSup(pPhyFillNode, pInterval, pFillExprInfo, numOfFillCols); diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index b4e2b73889..9b4b7f1ee8 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -867,10 +867,6 @@ static int32_t saveWinResult(int64_t ts, int32_t pageId, int32_t offset, uint64_ return TSDB_CODE_SUCCESS; } -static int32_t saveWinResultRow(SResultRow* result, uint64_t groupId, SHashObj* pUpdatedMap) { - return saveWinResult(result->win.skey, result->pageId, result->offset, groupId, pUpdatedMap); -} - static int32_t saveWinResultInfo(TSKEY ts, uint64_t groupId, SHashObj* pUpdatedMap) { return saveWinResult(ts, -1, -1, groupId, pUpdatedMap); } @@ -1390,7 +1386,7 @@ static bool doDeleteWindow(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamIntervalOperatorInfo* pInfo = pOperator->info; SWinKey key = {.ts = ts, .groupId = groupId}; tSimpleHashRemove(pInfo->aggSup.pResultRowHashTable, &key, sizeof(SWinKey)); - streamStateDel(pOperator->pTaskInfo->streamInfo.pState, &key); + streamStateDel(pInfo->pState, &key); return true; } @@ -1406,7 +1402,7 @@ static void doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, int3 SResultRowInfo dumyInfo; dumyInfo.cur.pageId = -1; STimeWindow win = getActiveTimeWindow(NULL, &dumyInfo, startTsCols[i], pInterval, TSDB_ORDER_ASC); - while (win.ekey <= endTsCols[i]) { + while (win.skey <= endTsCols[i]) { uint64_t winGpId = pGpDatas[i]; bool res = doDeleteWindow(pOperator, win.skey, winGpId, numOfOutput); SWinKey winRes = {.ts = win.skey, .groupId = winGpId}; @@ -1505,64 +1501,13 @@ static int32_t getAllIntervalWindow(SSHashObj* pHashMap, SHashObj* resWins) { return TSDB_CODE_SUCCESS; } -static int32_t closeIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp* pSup, SInterval* pInterval, - SHashObj* pPullDataMap, SHashObj* closeWins, SArray* pRecyPages, - SDiskbasedBuf* pDiscBuf) { - qDebug("===stream===close interval window"); - void* pIte = NULL; - size_t keyLen = 0; - int32_t iter = 0; - while ((pIte = tSimpleHashIterate(pHashMap, pIte, &iter)) != NULL) { - void* key = tSimpleHashGetKey(pIte, &keyLen); - uint64_t groupId = *(uint64_t*)key; - ASSERT(keyLen == GET_RES_WINDOW_KEY_LEN(sizeof(TSKEY))); - TSKEY ts = *(int64_t*)((char*)key + sizeof(uint64_t)); - STimeWindow win; - win.skey = ts; - win.ekey = taosTimeAdd(win.skey, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1; - SWinKey winRe = { - .ts = win.skey, - .groupId = groupId, - }; - void* chIds = taosHashGet(pPullDataMap, &winRe, sizeof(SWinKey)); - if (isCloseWindow(&win, pSup)) { - if (chIds && pPullDataMap) { - SArray* chAy = *(SArray**)chIds; - int32_t size = taosArrayGetSize(chAy); - qDebug("===stream===window %" PRId64 " wait child size:%d", win.skey, size); - for (int32_t i = 0; i < size; i++) { - qDebug("===stream===window %" PRId64 " wait child id:%d", win.skey, *(int32_t*)taosArrayGet(chAy, i)); - } - continue; - } else if (pPullDataMap) { - qDebug("===stream===close window %" PRId64, win.skey); - } - SResultRowPosition* pPos = (SResultRowPosition*)pIte; - if (pSup->calTrigger == STREAM_TRIGGER_WINDOW_CLOSE) { - int32_t code = saveWinResult(ts, pPos->pageId, pPos->offset, groupId, closeWins); - if (code != TSDB_CODE_SUCCESS) { - return code; - } - ASSERT(pRecyPages != NULL); - taosArrayPush(pRecyPages, &pPos->pageId); - } else { - // SFilePage* bufPage = getBufPage(pDiscBuf, pPos->pageId); - // dBufSetBufPageRecycled(pDiscBuf, bufPage); - } - char keyBuf[GET_RES_WINDOW_KEY_LEN(sizeof(TSKEY))]; - SET_RES_WINDOW_KEY(keyBuf, &ts, sizeof(TSKEY), groupId); - tSimpleHashIterateRemove(pHashMap, keyBuf, keyLen, &pIte, &iter); - } - } - return TSDB_CODE_SUCCESS; -} - static int32_t closeStreamIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SInterval* pInterval, SHashObj* pPullDataMap, SHashObj* closeWins, SOperatorInfo* pOperator) { qDebug("===stream===close interval window"); - void* pIte = NULL; - size_t keyLen = 0; - int32_t iter = 0; + void* pIte = NULL; + size_t keyLen = 0; + int32_t iter = 0; + SStreamIntervalOperatorInfo* pInfo = pOperator->info; while ((pIte = tSimpleHashIterate(pHashMap, pIte, &iter)) != NULL) { void* key = tSimpleHashGetKey(pIte, &keyLen); SWinKey* pWinKey = (SWinKey*)key; @@ -1591,24 +1536,85 @@ static int32_t closeStreamIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp } } tSimpleHashIterateRemove(pHashMap, pWinKey, sizeof(SWinKey), &pIte, &iter); - - if (needDeleteWindowBuf(&win, pTwSup)) { - streamStateDel(pOperator->pTaskInfo->streamInfo.pState, pWinKey); - } } } return TSDB_CODE_SUCCESS; } -static void closeChildIntervalWindow(SArray* pChildren, TSKEY maxTs) { +STimeWindow getFinalTimeWindow(int64_t ts, SInterval* pInterval) { + STimeWindow w = {.skey = ts, .ekey = INT64_MAX}; + w.ekey = taosTimeAdd(w.skey, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1; + return w; +} + +static void deleteIntervalDiscBuf(SStreamState* pState, SHashObj* pPullDataMap, TSKEY mark, SInterval* pInterval, + SWinKey* key) { + STimeWindow tw = getFinalTimeWindow(key->ts, pInterval); + SWinKey next = {0}; + while (tw.ekey < mark) { + SStreamStateCur* pCur = streamStateSeekKeyNext(pState, key); + int32_t code = streamStateGetKVByCur(pCur, &next, NULL, 0); + streamStateFreeCur(pCur); + + void* chIds = taosHashGet(pPullDataMap, key, sizeof(SWinKey)); + if (chIds && pPullDataMap) { + SArray* chAy = *(SArray**)chIds; + int32_t size = taosArrayGetSize(chAy); + qDebug("===stream===window %" PRId64 " wait child size:%d", key->ts, size); + for (int32_t i = 0; i < size; i++) { + qDebug("===stream===window %" PRId64 " wait child id:%d", key->ts, *(int32_t*)taosArrayGet(chAy, i)); + } + break; + } + qDebug("===stream===delete window %" PRId64, key->ts); + int32_t codeDel = streamStateDel(pState, key); + if (codeDel != TSDB_CODE_SUCCESS) { + code = streamStateGetFirst(pState, key); + if (code != TSDB_CODE_SUCCESS) { + qDebug("===stream===stream state first key: empty-empty"); + return; + } + continue; + } + if (code == TSDB_CODE_SUCCESS) { + *key = next; + tw = getFinalTimeWindow(key->ts, pInterval); + } + } + + if (qDebugFlag & DEBUG_DEBUG) { + SStreamStateCur* pCur = streamStateGetCur(pState, key); + int32_t code = streamStateCurPrev(pState, pCur); + if (code == TSDB_CODE_SUCCESS) { + SWinKey tmpKey = {0}; + code = streamStateGetKVByCur(pCur, &tmpKey, NULL, 0); + if (code == TSDB_CODE_SUCCESS) { + STimeWindow tw = getFinalTimeWindow(tmpKey.ts, pInterval); + qDebug("===stream===error stream state first key:%" PRId64 "-%" PRId64 ",%" PRId64 ",mark %" PRId64, tw.skey, + tw.ekey, tmpKey.groupId, mark); + } else { + STimeWindow tw = getFinalTimeWindow(key->ts, pInterval); + qDebug("===stream===stream state first key:%" PRId64 "-%" PRId64 ",%" PRId64 ",mark %" PRId64, tw.skey, tw.ekey, + key->groupId, mark); + } + } else { + STimeWindow tw = getFinalTimeWindow(key->ts, pInterval); + qDebug("===stream===stream state first key:%" PRId64 "-%" PRId64 ",%" PRId64 ",mark %" PRId64, tw.skey, tw.ekey, + key->groupId, mark); + } + streamStateFreeCur(pCur); + } +} + +static void closeChildIntervalWindow(SOperatorInfo* pOperator, SArray* pChildren, TSKEY maxTs) { int32_t size = taosArrayGetSize(pChildren); for (int32_t i = 0; i < size; i++) { - SOperatorInfo* pChildOp = taosArrayGetP(pChildren, i); - SStreamFinalIntervalOperatorInfo* pChInfo = pChildOp->info; + SOperatorInfo* pChildOp = taosArrayGetP(pChildren, i); + SStreamIntervalOperatorInfo* pChInfo = pChildOp->info; ASSERT(pChInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE); pChInfo->twAggSup.maxTs = TMAX(pChInfo->twAggSup.maxTs, maxTs); - closeIntervalWindow(pChInfo->aggSup.pResultRowHashTable, &pChInfo->twAggSup, &pChInfo->interval, NULL, NULL, NULL, - pChInfo->aggSup.pResultBuf); + closeStreamIntervalWindow(pChInfo->aggSup.pResultRowHashTable, &pChInfo->twAggSup, &pChInfo->interval, NULL, NULL, + pOperator); } } @@ -1660,13 +1666,10 @@ void destroyIntervalOperatorInfo(void* param) { tdListFree(pInfo->binfo.resultRowInfo.openWindow); - pInfo->pRecycledPages = taosArrayDestroy(pInfo->pRecycledPages); pInfo->pInterpCols = taosArrayDestroy(pInfo->pInterpCols); taosArrayDestroyEx(pInfo->pPrevValues, freeItem); pInfo->pPrevValues = NULL; - pInfo->pDelWins = taosArrayDestroy(pInfo->pDelWins); - pInfo->pDelRes = blockDataDestroy(pInfo->pDelRes); cleanupGroupResInfo(&pInfo->groupResInfo); colDataDestroy(&pInfo->twAggSup.timeWindowData); @@ -1674,17 +1677,17 @@ void destroyIntervalOperatorInfo(void* param) { } void destroyStreamFinalIntervalOperatorInfo(void* param) { - SStreamFinalIntervalOperatorInfo* pInfo = (SStreamFinalIntervalOperatorInfo*)param; + SStreamIntervalOperatorInfo* pInfo = (SStreamIntervalOperatorInfo*)param; cleanupBasicInfo(&pInfo->binfo); cleanupAggSup(&pInfo->aggSup); // it should be empty. taosHashCleanup(pInfo->pPullDataMap); taosArrayDestroy(pInfo->pPullWins); blockDataDestroy(pInfo->pPullDataRes); - taosArrayDestroy(pInfo->pRecycledPages); blockDataDestroy(pInfo->pUpdateRes); taosArrayDestroy(pInfo->pDelWins); blockDataDestroy(pInfo->pDelRes); + taosMemoryFreeClear(pInfo->pState); if (pInfo->pChildren) { int32_t size = taosArrayGetSize(pInfo->pChildren); @@ -1794,7 +1797,6 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pInfo->interval = *pInterval; pInfo->execModel = pTaskInfo->execModel; pInfo->twAggSup = *pTwAggSupp; - pInfo->ignoreExpiredData = pPhyNode->window.igExpired; pInfo->pCondition = pPhyNode->window.node.pConditions; pInfo->binfo.mergeResultBlock = pPhyNode->window.mergeDataBlock; @@ -1827,9 +1829,6 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pInfo->win); - pInfo->invertible = allInvertible(pSup->pCtx, numOfCols); - pInfo->invertible = false; // Todo(liuyao): Dependent TSDB API - pInfo->timeWindowInterpo = timeWindowinterpNeeded(pSup->pCtx, numOfCols, pInfo); if (pInfo->timeWindowInterpo) { pInfo->binfo.resultRowInfo.openWindow = tdListNew(sizeof(SOpenWindowInfo)); @@ -1838,10 +1837,6 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* } } - pInfo->pRecycledPages = taosArrayInit(4, sizeof(int32_t)); - pInfo->pDelWins = taosArrayInit(4, sizeof(SWinKey)); - pInfo->delIndex = 0; - pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT); initResultRowInfo(&pInfo->binfo.resultRowInfo); pOperator->name = "TimeIntervalAggOperator"; @@ -2100,7 +2095,7 @@ static void genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp for (int32_t j = 0; j < pExprSup->numOfExprs; ++j) { SExprInfo* pExprInfo = &pExprSup->pExprInfo[j]; - int32_t dstSlot = pExprInfo->base.resSchema.slotId; + int32_t dstSlot = pExprInfo->base.resSchema.slotId; SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot); if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) { @@ -2356,13 +2351,13 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) { for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) { SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[j]; - int32_t dstSlot = pExprInfo->base.resSchema.slotId; + int32_t dstSlot = pExprInfo->base.resSchema.slotId; SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot); if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) { - colDataAppend(pDst, pResBlock->info.rows, (char *)&pSliceInfo->current, false); + colDataAppend(pDst, pResBlock->info.rows, (char*)&pSliceInfo->current, false); } else { - int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId; + int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId; SColumnInfoData* pSrc = taosArrayGet(pBlock->pDataBlock, srcSlot); if (colDataIsNull_s(pSrc, i)) { @@ -2493,13 +2488,13 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) { for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) { SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[j]; - int32_t dstSlot = pExprInfo->base.resSchema.slotId; + int32_t dstSlot = pExprInfo->base.resSchema.slotId; SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot); if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) { - colDataAppend(pDst, pResBlock->info.rows, (char *)&pSliceInfo->current, false); + colDataAppend(pDst, pResBlock->info.rows, (char*)&pSliceInfo->current, false); } else { - int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId; + int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId; SColumnInfoData* pSrc = taosArrayGet(pBlock->pDataBlock, srcSlot); if (colDataIsNull_s(pSrc, i)) { @@ -2837,24 +2832,15 @@ void compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx, int3 } } -bool hasIntervalWindow(SAggSupporter* pSup, TSKEY ts, uint64_t groupId) { - int32_t bytes = sizeof(TSKEY); - SET_RES_WINDOW_KEY(pSup->keyBuf, &ts, bytes, groupId); - SResultRowPosition* p1 = - (SResultRowPosition*)tSimpleHashGet(pSup->pResultRowHashTable, pSup->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes)); - return p1 != NULL; +bool hasIntervalWindow(SStreamState* pState, SWinKey* pKey) { + return TSDB_CODE_SUCCESS == streamStateGet(pState, pKey, NULL, 0); } -STimeWindow getFinalTimeWindow(int64_t ts, SInterval* pInterval) { - STimeWindow w = {.skey = ts, .ekey = INT64_MAX}; - w.ekey = taosTimeAdd(w.skey, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1; - return w; -} - -static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExprSupp* pSup, SArray* pWinArray, - int32_t groupId, int32_t numOfOutput, SExecTaskInfo* pTaskInfo, - SHashObj* pUpdatedMap) { - int32_t size = taosArrayGetSize(pWinArray); +static void rebuildIntervalWindow(SOperatorInfo* pOperator, SExprSupp* pSup, SArray* pWinArray, SHashObj* pUpdatedMap) { + SStreamIntervalOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + int32_t size = taosArrayGetSize(pWinArray); + int32_t numOfOutput = pOperator->exprSupp.numOfExprs; if (!pInfo->pChildren) { return; } @@ -2862,31 +2848,35 @@ static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExpr SWinKey* pWinRes = taosArrayGet(pWinArray, i); SResultRow* pCurResult = NULL; STimeWindow parentWin = getFinalTimeWindow(pWinRes->ts, &pInfo->interval); - if (isDeletedWindow(&parentWin, pWinRes->groupId, &pInfo->aggSup) && isCloseWindow(&parentWin, &pInfo->twAggSup)) { + if (isDeletedStreamWindow(&parentWin, pWinRes->groupId, pInfo->pState, &pInfo->twAggSup) && + isCloseWindow(&parentWin, &pInfo->twAggSup)) { continue; } - setTimeWindowOutputBuf(&pInfo->binfo.resultRowInfo, &parentWin, true, &pCurResult, pWinRes->groupId, pSup->pCtx, - numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo); + int32_t code = setOutputBuf(pInfo->pState, &parentWin, &pCurResult, pWinRes->groupId, pSup->pCtx, numOfOutput, + pSup->rowEntryInfoOffset, &pInfo->aggSup); + if (code != TSDB_CODE_SUCCESS || pCurResult == NULL) { + T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); + } int32_t numOfChildren = taosArrayGetSize(pInfo->pChildren); int32_t num = 0; for (int32_t j = 0; j < numOfChildren; j++) { - SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, j); - SIntervalAggOperatorInfo* pChInfo = pChildOp->info; - SExprSupp* pChildSup = &pChildOp->exprSupp; - if (!hasIntervalWindow(&pChInfo->aggSup, pWinRes->ts, pWinRes->groupId)) { + SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, j); + SStreamIntervalOperatorInfo* pChInfo = pChildOp->info; + SExprSupp* pChildSup = &pChildOp->exprSupp; + if (!hasIntervalWindow(pChInfo->pState, pWinRes)) { continue; } num++; SResultRow* pChResult = NULL; - setTimeWindowOutputBuf(&pChInfo->binfo.resultRowInfo, &parentWin, true, &pChResult, pWinRes->groupId, - pChildSup->pCtx, pChildSup->numOfExprs, pChildSup->rowEntryInfoOffset, &pChInfo->aggSup, - pTaskInfo); + setOutputBuf(pChInfo->pState, &parentWin, &pChResult, pWinRes->groupId, pChildSup->pCtx, pChildSup->numOfExprs, + pChildSup->rowEntryInfoOffset, &pChInfo->aggSup); updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &parentWin, true); compactFunctions(pSup->pCtx, pChildSup->pCtx, numOfOutput, pTaskInfo, &pInfo->twAggSup.timeWindowData); } if (num > 0 && pUpdatedMap) { - saveWinResultRow(pCurResult, pWinRes->groupId, pUpdatedMap); - setResultBufPageDirty(pInfo->aggSup.pResultBuf, &pInfo->binfo.resultRowInfo.cur); + saveWinResultInfo(pCurResult->win.skey, pWinRes->groupId, pUpdatedMap); + saveOutputBuf(pInfo->pState, pWinRes, pCurResult, pInfo->aggSup.resultRowSize); + releaseOutputBuf(pInfo->pState, pWinRes, pCurResult); } } } @@ -2898,15 +2888,15 @@ bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup) { return p1 == NULL; } -bool isDeletedStreamWindow(STimeWindow* pWin, uint64_t groupId, SOperatorInfo* pOperator, STimeWindowAggSupp* pTwSup) { +bool isDeletedStreamWindow(STimeWindow* pWin, uint64_t groupId, SStreamState* pState, STimeWindowAggSupp* pTwSup) { if (pWin->ekey < pTwSup->maxTs - pTwSup->deleteMark) { SWinKey key = {.ts = pWin->skey, .groupId = groupId}; void* pVal = NULL; int32_t size = 0; - if (streamStateGet(pOperator->pTaskInfo->streamInfo.pState, &key, &pVal, &size) < 0) { + if (streamStateGet(pState, &key, &pVal, &size) == TSDB_CODE_SUCCESS) { return false; } - streamStateReleaseBuf(pOperator->pTaskInfo->streamInfo.pState, &key, pVal); + return true; } return false; } @@ -2929,109 +2919,12 @@ void addPullWindow(SHashObj* pMap, SWinKey* pWinRes, int32_t size) { static int32_t getChildIndex(SSDataBlock* pBlock) { return pBlock->info.childId; } -static void doHashIntervalAgg(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBlock, uint64_t tableGroupId, - SHashObj* pUpdatedMap) { - SStreamFinalIntervalOperatorInfo* pInfo = (SStreamFinalIntervalOperatorInfo*)pOperatorInfo->info; - SResultRowInfo* pResultRowInfo = &(pInfo->binfo.resultRowInfo); - SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo; - SExprSupp* pSup = &pOperatorInfo->exprSupp; - int32_t numOfOutput = pSup->numOfExprs; - int32_t step = 1; - TSKEY* tsCols = NULL; - SResultRow* pResult = NULL; - int32_t forwardRows = 0; - - ASSERT(pSDataBlock->pDataBlock != NULL); - SColumnInfoData* pColDataInfo = taosArrayGet(pSDataBlock->pDataBlock, pInfo->primaryTsIndex); - tsCols = (int64_t*)pColDataInfo->pData; - - int32_t startPos = 0; - TSKEY ts = getStartTsKey(&pSDataBlock->info.window, tsCols); - STimeWindow nextWin = {0}; - if (IS_FINAL_OP(pInfo)) { - nextWin = getFinalTimeWindow(ts, &pInfo->interval); - } else { - nextWin = getActiveTimeWindow(pInfo->aggSup.pResultBuf, pResultRowInfo, ts, &pInfo->interval, pInfo->order); - } - while (1) { - bool isClosed = isCloseWindow(&nextWin, &pInfo->twAggSup); - if ((pInfo->ignoreExpiredData && isClosed) || !inSlidingWindow(&pInfo->interval, &nextWin, &pSDataBlock->info)) { - startPos = getNexWindowPos(&pInfo->interval, &pSDataBlock->info, tsCols, startPos, nextWin.ekey, &nextWin); - if (startPos < 0) { - break; - } - continue; - } - if (IS_FINAL_OP(pInfo) && isClosed && pInfo->pChildren) { - bool ignore = true; - SWinKey winRes = { - .ts = nextWin.skey, - .groupId = tableGroupId, - }; - void* chIds = taosHashGet(pInfo->pPullDataMap, &winRes, sizeof(SWinKey)); - if (isDeletedWindow(&nextWin, tableGroupId, &pInfo->aggSup) && !chIds) { - SPullWindowInfo pull = {.window = nextWin, .groupId = tableGroupId}; - // add pull data request - savePullWindow(&pull, pInfo->pPullWins); - int32_t size = taosArrayGetSize(pInfo->pChildren); - addPullWindow(pInfo->pPullDataMap, &winRes, size); - qDebug("===stream===prepare retrive %" PRId64 ", size:%d", winRes.ts, size); - } else { - int32_t index = -1; - SArray* chArray = NULL; - int32_t chId = 0; - if (chIds) { - chArray = *(void**)chIds; - chId = getChildIndex(pSDataBlock); - index = taosArraySearchIdx(chArray, &chId, compareInt32Val, TD_EQ); - } - if (index == -1 || pSDataBlock->info.type == STREAM_PULL_DATA) { - ignore = false; - } - } - - if (ignore) { - startPos = getNexWindowPos(&pInfo->interval, &pSDataBlock->info, tsCols, startPos, nextWin.ekey, &nextWin); - if (startPos < 0) { - break; - } - continue; - } - } - - int32_t code = setTimeWindowOutputBuf(pResultRowInfo, &nextWin, true, &pResult, tableGroupId, pSup->pCtx, - numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo); - if (code != TSDB_CODE_SUCCESS || pResult == NULL) { - T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); - } - - if (IS_FINAL_OP(pInfo)) { - forwardRows = 1; - } else { - forwardRows = getNumOfRowsInTimeWindow(&pSDataBlock->info, tsCols, startPos, nextWin.ekey, binarySearchForKey, - NULL, TSDB_ORDER_ASC); - } - if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pUpdatedMap) { - saveWinResultRow(pResult, tableGroupId, pUpdatedMap); - setResultBufPageDirty(pInfo->aggSup.pResultBuf, &pResultRowInfo->cur); - } - updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &nextWin, true); - doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, - pSDataBlock->info.rows, numOfOutput); - int32_t prevEndPos = (forwardRows - 1) * step + startPos; - ASSERT(pSDataBlock->info.window.skey > 0 && pSDataBlock->info.window.ekey > 0); - startPos = getNextQualifiedWindow(&pInfo->interval, &nextWin, &pSDataBlock->info, tsCols, prevEndPos, pInfo->order); - if (startPos < 0) { - break; - } - } -} - -static void clearStreamIntervalOperator(SStreamFinalIntervalOperatorInfo* pInfo) { +static void clearStreamIntervalOperator(SStreamIntervalOperatorInfo* pInfo) { tSimpleHashClear(pInfo->aggSup.pResultRowHashTable); clearDiskbasedBuf(pInfo->aggSup.pResultBuf); initResultRowInfo(&pInfo->binfo.resultRowInfo); pInfo->aggSup.currentPageId = -1; + streamStateClear(pInfo->pState); } static void clearSpecialDataBlock(SSDataBlock* pBlock) { @@ -3115,12 +3008,12 @@ void processPullOver(SSDataBlock* pBlock, SHashObj* pMap) { } } -static void addRetriveWindow(SArray* wins, SStreamFinalIntervalOperatorInfo* pInfo) { +static void addRetriveWindow(SArray* wins, SStreamIntervalOperatorInfo* pInfo) { int32_t size = taosArrayGetSize(wins); for (int32_t i = 0; i < size; i++) { SWinKey* winKey = taosArrayGet(wins, i); STimeWindow nextWin = getFinalTimeWindow(winKey->ts, &pInfo->interval); - if (isCloseWindow(&nextWin, &pInfo->twAggSup) && !pInfo->ignoreExpiredData) { + if (needDeleteWindowBuf(&nextWin, &pInfo->twAggSup) && !pInfo->ignoreExpiredData) { void* chIds = taosHashGet(pInfo->pPullDataMap, winKey, sizeof(SWinKey)); if (!chIds) { SPullWindowInfo pull = {.window = nextWin, .groupId = winKey->groupId}; @@ -3140,8 +3033,124 @@ static void clearFunctionContext(SExprSupp* pSup) { } } +void doBuildResult(SOperatorInfo* pOperator, SStreamState* pState, SSDataBlock* pBlock, SGroupResInfo* pGroupResInfo) { + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + // set output datablock version + pBlock->info.version = pTaskInfo->version; + + blockDataCleanup(pBlock); + if (!hasRemainResults(pGroupResInfo)) { + return; + } + + // clear the existed group id + pBlock->info.groupId = 0; + buildDataBlockFromGroupRes(pTaskInfo, pState, pBlock, &pOperator->exprSupp, pGroupResInfo); +} + +static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBlock, uint64_t groupId, + SHashObj* pUpdatedMap) { + SStreamIntervalOperatorInfo* pInfo = (SStreamIntervalOperatorInfo*)pOperatorInfo->info; + + SResultRowInfo* pResultRowInfo = &(pInfo->binfo.resultRowInfo); + SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo; + SExprSupp* pSup = &pOperatorInfo->exprSupp; + int32_t numOfOutput = pSup->numOfExprs; + int32_t step = 1; + TSKEY* tsCols = NULL; + SResultRow* pResult = NULL; + int32_t forwardRows = 0; + + ASSERT(pSDataBlock->pDataBlock != NULL); + SColumnInfoData* pColDataInfo = taosArrayGet(pSDataBlock->pDataBlock, pInfo->primaryTsIndex); + tsCols = (int64_t*)pColDataInfo->pData; + + int32_t startPos = 0; + TSKEY ts = getStartTsKey(&pSDataBlock->info.window, tsCols); + STimeWindow nextWin = + getActiveTimeWindow(pInfo->aggSup.pResultBuf, pResultRowInfo, ts, &pInfo->interval, TSDB_ORDER_ASC); + while (1) { + bool isClosed = isCloseWindow(&nextWin, &pInfo->twAggSup); + if ((pInfo->ignoreExpiredData && isClosed) || !inSlidingWindow(&pInfo->interval, &nextWin, &pSDataBlock->info)) { + startPos = getNexWindowPos(&pInfo->interval, &pSDataBlock->info, tsCols, startPos, nextWin.ekey, &nextWin); + if (startPos < 0) { + break; + } + continue; + } + + if (IS_FINAL_OP(pInfo) && isClosed && pInfo->pChildren) { + bool ignore = true; + SWinKey winRes = { + .ts = nextWin.skey, + .groupId = groupId, + }; + void* chIds = taosHashGet(pInfo->pPullDataMap, &winRes, sizeof(SWinKey)); + if (isDeletedStreamWindow(&nextWin, groupId, pInfo->pState, &pInfo->twAggSup) && !chIds) { + SPullWindowInfo pull = {.window = nextWin, .groupId = groupId}; + // add pull data request + savePullWindow(&pull, pInfo->pPullWins); + int32_t size = taosArrayGetSize(pInfo->pChildren); + addPullWindow(pInfo->pPullDataMap, &winRes, size); + qDebug("===stream===prepare retrive %" PRId64 ", size:%d", winRes.ts, size); + } else { + int32_t index = -1; + SArray* chArray = NULL; + int32_t chId = 0; + if (chIds) { + chArray = *(void**)chIds; + chId = getChildIndex(pSDataBlock); + index = taosArraySearchIdx(chArray, &chId, compareInt32Val, TD_EQ); + } + if (index == -1 || pSDataBlock->info.type == STREAM_PULL_DATA) { + ignore = false; + } + } + + if (ignore) { + startPos = getNexWindowPos(&pInfo->interval, &pSDataBlock->info, tsCols, startPos, nextWin.ekey, &nextWin); + if (startPos < 0) { + break; + } + continue; + } + } + + int32_t code = setOutputBuf(pInfo->pState, &nextWin, &pResult, groupId, pSup->pCtx, numOfOutput, + pSup->rowEntryInfoOffset, &pInfo->aggSup); + if (code != TSDB_CODE_SUCCESS || pResult == NULL) { + T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); + } + + forwardRows = getNumOfRowsInTimeWindow(&pSDataBlock->info, tsCols, startPos, nextWin.ekey, binarySearchForKey, NULL, + TSDB_ORDER_ASC); + if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pUpdatedMap) { + saveWinResultInfo(pResult->win.skey, groupId, pUpdatedMap); + } + updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &nextWin, true); + doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, + pSDataBlock->info.rows, numOfOutput); + SWinKey key = { + .ts = nextWin.skey, + .groupId = groupId, + }; + saveOutputBuf(pInfo->pState, &key, pResult, pInfo->aggSup.resultRowSize); + releaseOutputBuf(pInfo->pState, &key, pResult); + if (pInfo->delKey.ts > key.ts) { + pInfo->delKey = key; + } + int32_t prevEndPos = (forwardRows - 1) * step + startPos; + ASSERT(pSDataBlock->info.window.skey > 0 && pSDataBlock->info.window.ekey > 0); + startPos = + getNextQualifiedWindow(&pInfo->interval, &nextWin, &pSDataBlock->info, tsCols, prevEndPos, TSDB_ORDER_ASC); + if (startPos < 0) { + break; + } + } +} + static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { - SStreamFinalIntervalOperatorInfo* pInfo = pOperator->info; + SStreamIntervalOperatorInfo* pInfo = pOperator->info; SOperatorInfo* downstream = pOperator->pDownstream[0]; TSKEY maxTs = INT64_MIN; @@ -3169,7 +3178,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { return pInfo->pDelRes; } - doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf); + doBuildResult(pOperator, pInfo->pState, pInfo->binfo.pRes, &pInfo->groupResInfo); if (pInfo->binfo.pRes->info.rows != 0) { printDataBlock(pInfo->binfo.pRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); return pInfo->binfo.pRes; @@ -3182,12 +3191,13 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { clearStreamIntervalOperator(pInfo); qDebug("===stream===clear semi operator"); } else { - freeAllPages(pInfo->pRecycledPages, pInfo->aggSup.pResultBuf); + deleteIntervalDiscBuf(pInfo->pState, pInfo->pPullDataMap, pInfo->twAggSup.maxTs - pInfo->twAggSup.deleteMark, + &pInfo->interval, &pInfo->delKey); } return NULL; } else { if (!IS_FINAL_OP(pInfo)) { - doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf); + doBuildResult(pOperator, pInfo->pState, pInfo->binfo.pRes, &pInfo->groupResInfo); if (pInfo->binfo.pRes->info.rows != 0) { printDataBlock(pInfo->binfo.pRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); return pInfo->binfo.pRes; @@ -3227,16 +3237,15 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { pInfo->binfo.pRes->info.type = pBlock->info.type; } else if (pBlock->info.type == STREAM_CLEAR) { SArray* pUpWins = taosArrayInit(8, sizeof(SWinKey)); - doClearWindows(&pInfo->aggSup, pSup, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, pUpWins); + doDeleteWindows(pOperator, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, pUpWins, NULL); if (IS_FINAL_OP(pInfo)) { - int32_t childIndex = getChildIndex(pBlock); - SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex); - SStreamFinalIntervalOperatorInfo* pChildInfo = pChildOp->info; - SExprSupp* pChildSup = &pChildOp->exprSupp; + int32_t childIndex = getChildIndex(pBlock); + SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex); + SStreamIntervalOperatorInfo* pChildInfo = pChildOp->info; + SExprSupp* pChildSup = &pChildOp->exprSupp; - doClearWindows(&pChildInfo->aggSup, pChildSup, &pChildInfo->interval, pChildSup->numOfExprs, pBlock, NULL); - rebuildIntervalWindow(pInfo, pSup, pUpWins, pInfo->binfo.pRes->info.groupId, pOperator->exprSupp.numOfExprs, - pOperator->pTaskInfo, NULL); + doDeleteWindows(pChildOp, &pChildInfo->interval, pChildOp->exprSupp.numOfExprs, pBlock, NULL, NULL); + rebuildIntervalWindow(pOperator, pSup, pUpWins, pUpdatedMap); taosArrayDestroy(pUpWins); continue; } @@ -3247,15 +3256,14 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { break; } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) { SArray* delWins = taosArrayInit(8, sizeof(SWinKey)); - doDeleteSpecifyIntervalWindow(&pInfo->aggSup, &pInfo->twAggSup, pBlock, delWins, &pInfo->interval, pUpdatedMap); + doDeleteWindows(pOperator, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, delWins, pUpdatedMap); if (IS_FINAL_OP(pInfo)) { - int32_t childIndex = getChildIndex(pBlock); - SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex); - SStreamFinalIntervalOperatorInfo* pChildInfo = pChildOp->info; - SExprSupp* pChildSup = &pChildOp->exprSupp; - doDeleteSpecifyIntervalWindow(&pChildInfo->aggSup, &pInfo->twAggSup, pBlock, NULL, &pChildInfo->interval, NULL); - rebuildIntervalWindow(pInfo, pSup, delWins, pInfo->binfo.pRes->info.groupId, pOperator->exprSupp.numOfExprs, - pOperator->pTaskInfo, pUpdatedMap); + int32_t childIndex = getChildIndex(pBlock); + SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex); + SStreamIntervalOperatorInfo* pChildInfo = pChildOp->info; + SExprSupp* pChildSup = &pChildOp->exprSupp; + doDeleteWindows(pChildOp, &pChildInfo->interval, pChildOp->exprSupp.numOfExprs, pBlock, NULL, NULL); + rebuildIntervalWindow(pOperator, pSup, delWins, pUpdatedMap); addRetriveWindow(delWins, pInfo); taosArrayAddAll(pInfo->pDelWins, delWins); taosArrayDestroy(delWins); @@ -3269,10 +3277,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { getAllIntervalWindow(pInfo->aggSup.pResultRowHashTable, pUpdatedMap); continue; } else if (pBlock->info.type == STREAM_RETRIEVE && !IS_FINAL_OP(pInfo)) { - SArray* pUpWins = taosArrayInit(8, sizeof(SWinKey)); - doClearWindows(&pInfo->aggSup, pSup, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, pUpWins); - removeResults(pUpWins, pUpdatedMap); - taosArrayDestroy(pUpWins); + doDeleteWindows(pOperator, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, NULL, pUpdatedMap); if (taosArrayGetSize(pUpdated) > 0) { break; } @@ -3286,8 +3291,8 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { SExprSupp* pExprSup = &pInfo->scalarSupp; projectApplyFunctions(pExprSup->pExprInfo, pBlock, pBlock, pExprSup->pCtx, pExprSup->numOfExprs, NULL); } - setInputDataBlock(pOperator, pSup->pCtx, pBlock, pInfo->order, MAIN_SCAN, true); - doHashIntervalAgg(pOperator, pBlock, pBlock->info.groupId, pUpdatedMap); + setInputDataBlock(pOperator, pSup->pCtx, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true); + doStreamIntervalAggImpl(pOperator, pBlock, pBlock->info.groupId, pUpdatedMap); if (IS_FINAL_OP(pInfo)) { int32_t chIndex = getChildIndex(pBlock); int32_t size = taosArrayGetSize(pInfo->pChildren); @@ -3297,15 +3302,15 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { if (!pChildOp) { T_LONG_JMP(pOperator->pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); } - SStreamFinalIntervalOperatorInfo* pTmpInfo = pChildOp->info; + SStreamIntervalOperatorInfo* pTmpInfo = pChildOp->info; pTmpInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE; taosArrayPush(pInfo->pChildren, &pChildOp); qDebug("===stream===add child, id:%d", chIndex); } - SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, chIndex); - SStreamFinalIntervalOperatorInfo* pChInfo = pChildOp->info; - setInputDataBlock(pChildOp, pChildOp->exprSupp.pCtx, pBlock, pChInfo->order, MAIN_SCAN, true); - doHashIntervalAgg(pChildOp, pBlock, pBlock->info.groupId, NULL); + SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, chIndex); + SStreamIntervalOperatorInfo* pChInfo = pChildOp->info; + setInputDataBlock(pChildOp, pChildOp->exprSupp.pCtx, pBlock, TSDB_ORDER_ASC, MAIN_SCAN, true); + doStreamIntervalAggImpl(pChildOp, pBlock, pBlock->info.groupId, NULL); } maxTs = TMAX(maxTs, pBlock->info.window.ekey); maxTs = TMAX(maxTs, pBlock->info.watermark); @@ -3315,12 +3320,11 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, maxTs); pInfo->twAggSup.minTs = TMIN(pInfo->twAggSup.minTs, minTs); if (IS_FINAL_OP(pInfo)) { - closeIntervalWindow(pInfo->aggSup.pResultRowHashTable, &pInfo->twAggSup, &pInfo->interval, pInfo->pPullDataMap, - pUpdatedMap, pInfo->pRecycledPages, pInfo->aggSup.pResultBuf); - closeChildIntervalWindow(pInfo->pChildren, pInfo->twAggSup.maxTs); - } else { - pInfo->binfo.pRes->info.watermark = pInfo->twAggSup.maxTs; + closeStreamIntervalWindow(pInfo->aggSup.pResultRowHashTable, &pInfo->twAggSup, &pInfo->interval, + pInfo->pPullDataMap, pUpdatedMap, pOperator); + closeChildIntervalWindow(pOperator, pInfo->pChildren, pInfo->twAggSup.maxTs); } + pInfo->binfo.pRes->info.watermark = pInfo->twAggSup.maxTs; void* pIte = NULL; while ((pIte = taosHashIterate(pUpdatedMap, pIte)) != NULL) { @@ -3329,7 +3333,6 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { taosHashCleanup(pUpdatedMap); taosArraySort(pUpdated, resultrowComparAsc); - finalizeUpdatedResult(pOperator->exprSupp.numOfExprs, pInfo->aggSup.pResultBuf, pUpdated, pSup->rowEntryInfoOffset); initMultiResInfoFromArrayList(&pInfo->groupResInfo, pUpdated); blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity); @@ -3348,7 +3351,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { return pInfo->pDelRes; } - doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf); + doBuildResult(pOperator, pInfo->pState, pInfo->binfo.pRes, &pInfo->groupResInfo); if (pInfo->binfo.pRes->info.rows != 0) { printDataBlock(pInfo->binfo.pRes, IS_FINAL_OP(pInfo) ? "interval final" : "interval semi"); return pInfo->binfo.pRes; @@ -3366,15 +3369,14 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, int32_t numOfChild) { - SIntervalPhysiNode* pIntervalPhyNode = (SIntervalPhysiNode*)pPhyNode; - SStreamFinalIntervalOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamFinalIntervalOperatorInfo)); - SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); + SIntervalPhysiNode* pIntervalPhyNode = (SIntervalPhysiNode*)pPhyNode; + SStreamIntervalOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamIntervalOperatorInfo)); + SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); if (pInfo == NULL || pOperator == NULL) { goto _error; } pOperator->pTaskInfo = pTaskInfo; - pInfo->order = TSDB_ORDER_ASC; pInfo->interval = (SInterval){.interval = pIntervalPhyNode->interval, .sliding = pIntervalPhyNode->sliding, .intervalUnit = pIntervalPhyNode->intervalUnit, @@ -3386,6 +3388,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, .calTrigger = pIntervalPhyNode->window.triggerType, .maxTs = INT64_MIN, .minTs = INT64_MAX, + .deleteMark = INT64_MAX, }; ASSERT(pInfo->twAggSup.calTrigger != STREAM_TRIGGER_MAX_DELAY); pInfo->primaryTsIndex = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId; @@ -3415,6 +3418,10 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, ASSERT(numOfCols > 0); initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window); + pInfo->pState = taosMemoryCalloc(1, sizeof(SStreamState)); + *(pInfo->pState) = *(pTaskInfo->streamInfo.pState); + streamStateSetNumber(pInfo->pState, -1); + initResultRowInfo(&pInfo->binfo.resultRowInfo); pInfo->pChildren = NULL; if (numOfChild > 0) { @@ -3422,9 +3429,10 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, for (int32_t i = 0; i < numOfChild; i++) { SOperatorInfo* pChildOp = createStreamFinalIntervalOperatorInfo(NULL, pPhyNode, pTaskInfo, 0); if (pChildOp) { - SStreamFinalIntervalOperatorInfo* pChInfo = pChildOp->info; + SStreamIntervalOperatorInfo* pChInfo = pChildOp->info; pChInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE; taosArrayPush(pInfo->pChildren, &pChildOp); + streamStateSetNumber(pChInfo->pState, i); continue; } goto _error; @@ -3458,7 +3466,8 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT); pInfo->delIndex = 0; pInfo->pDelWins = taosArrayInit(4, sizeof(SWinKey)); - pInfo->pRecycledPages = taosArrayInit(4, sizeof(int32_t)); + pInfo->delKey.ts = INT64_MAX; + pInfo->delKey.groupId = 0; pOperator->operatorType = pPhyNode->type; pOperator->blocking = true; @@ -5600,160 +5609,6 @@ _error: return NULL; } -static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResultRowInfo, SSDataBlock* pBlock, - int32_t scanFlag, SHashObj* pUpdatedMap) { - SStreamIntervalOperatorInfo* pInfo = (SStreamIntervalOperatorInfo*)pOperatorInfo->info; - - SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo; - SExprSupp* pSup = &pOperatorInfo->exprSupp; - - int32_t startPos = 0; - int32_t numOfOutput = pSup->numOfExprs; - SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, pInfo->primaryTsIndex); - TSKEY* tsCols = (TSKEY*)pColDataInfo->pData; - uint64_t tableGroupId = pBlock->info.groupId; - bool ascScan = true; - TSKEY ts = getStartTsKey(&pBlock->info.window, tsCols); - SResultRow* pResult = NULL; - - STimeWindow win = getActiveTimeWindow(pInfo->aggSup.pResultBuf, pResultRowInfo, ts, &pInfo->interval, TSDB_ORDER_ASC); - int32_t ret = TSDB_CODE_SUCCESS; - if ((!pInfo->ignoreExpiredData || !isCloseWindow(&win, &pInfo->twAggSup)) && - inSlidingWindow(&pInfo->interval, &win, &pBlock->info)) { - ret = setTimeWindowOutputBuf(pResultRowInfo, &win, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, pSup->pCtx, - numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo); - if (ret != TSDB_CODE_SUCCESS || pResult == NULL) { - T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); - } - if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE) { - saveWinResultRow(pResult, tableGroupId, pUpdatedMap); - setResultBufPageDirty(pInfo->aggSup.pResultBuf, &pResultRowInfo->cur); - } - } - - TSKEY ekey = ascScan ? win.ekey : win.skey; - int32_t forwardRows = - getNumOfRowsInTimeWindow(&pBlock->info, tsCols, startPos, ekey, binarySearchForKey, NULL, TSDB_ORDER_ASC); - ASSERT(forwardRows > 0); - - if ((!pInfo->ignoreExpiredData || !isCloseWindow(&win, &pInfo->twAggSup)) && - inSlidingWindow(&pInfo->interval, &win, &pBlock->info)) { - updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &win, true); - doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, pBlock->info.rows, - numOfOutput); - } - - STimeWindow nextWin = win; - while (1) { - int32_t prevEndPos = forwardRows - 1 + startPos; - startPos = getNextQualifiedWindow(&pInfo->interval, &nextWin, &pBlock->info, tsCols, prevEndPos, TSDB_ORDER_ASC); - if (startPos < 0) { - break; - } - if (pInfo->ignoreExpiredData && isCloseWindow(&nextWin, &pInfo->twAggSup)) { - ekey = ascScan ? nextWin.ekey : nextWin.skey; - forwardRows = - getNumOfRowsInTimeWindow(&pBlock->info, tsCols, startPos, ekey, binarySearchForKey, NULL, TSDB_ORDER_ASC); - continue; - } - - // null data, failed to allocate more memory buffer - int32_t code = setTimeWindowOutputBuf(pResultRowInfo, &nextWin, (scanFlag == MAIN_SCAN), &pResult, tableGroupId, - pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, &pInfo->aggSup, pTaskInfo); - if (code != TSDB_CODE_SUCCESS || pResult == NULL) { - T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); - } - - if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE) { - saveWinResultRow(pResult, tableGroupId, pUpdatedMap); - setResultBufPageDirty(pInfo->aggSup.pResultBuf, &pResultRowInfo->cur); - } - - ekey = ascScan ? nextWin.ekey : nextWin.skey; - forwardRows = - getNumOfRowsInTimeWindow(&pBlock->info, tsCols, startPos, ekey, binarySearchForKey, NULL, TSDB_ORDER_ASC); - updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &nextWin, true); - doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, pBlock->info.rows, - numOfOutput); - } -} - -static void doStreamIntervalAggImpl2(SOperatorInfo* pOperatorInfo, SSDataBlock* pSDataBlock, uint64_t tableGroupId, - SHashObj* pUpdatedMap) { - SStreamIntervalOperatorInfo* pInfo = (SStreamIntervalOperatorInfo*)pOperatorInfo->info; - - SResultRowInfo* pResultRowInfo = &(pInfo->binfo.resultRowInfo); - SExecTaskInfo* pTaskInfo = pOperatorInfo->pTaskInfo; - SExprSupp* pSup = &pOperatorInfo->exprSupp; - int32_t numOfOutput = pSup->numOfExprs; - int32_t step = 1; - TSKEY* tsCols = NULL; - SResultRow* pResult = NULL; - int32_t forwardRows = 0; - - ASSERT(pSDataBlock->pDataBlock != NULL); - SColumnInfoData* pColDataInfo = taosArrayGet(pSDataBlock->pDataBlock, pInfo->primaryTsIndex); - tsCols = (int64_t*)pColDataInfo->pData; - - int32_t startPos = 0; - TSKEY ts = getStartTsKey(&pSDataBlock->info.window, tsCols); - STimeWindow nextWin = - getActiveTimeWindow(pInfo->aggSup.pResultBuf, pResultRowInfo, ts, &pInfo->interval, TSDB_ORDER_ASC); - while (1) { - bool isClosed = isCloseWindow(&nextWin, &pInfo->twAggSup); - if ((pInfo->ignoreExpiredData && isClosed) || !inSlidingWindow(&pInfo->interval, &nextWin, &pSDataBlock->info)) { - startPos = getNexWindowPos(&pInfo->interval, &pSDataBlock->info, tsCols, startPos, nextWin.ekey, &nextWin); - if (startPos < 0) { - break; - } - continue; - } - - int32_t code = setOutputBuf(&nextWin, &pResult, tableGroupId, pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset, - &pInfo->aggSup, pTaskInfo); - if (code != TSDB_CODE_SUCCESS || pResult == NULL) { - T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); - } - - forwardRows = getNumOfRowsInTimeWindow(&pSDataBlock->info, tsCols, startPos, nextWin.ekey, binarySearchForKey, NULL, - TSDB_ORDER_ASC); - if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pUpdatedMap) { - saveWinResultInfo(pResult->win.skey, tableGroupId, pUpdatedMap); - } - updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &nextWin, true); - doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows, - pSDataBlock->info.rows, numOfOutput); - SWinKey key = { - .ts = nextWin.skey, - .groupId = tableGroupId, - }; - saveOutputBuf(pTaskInfo, &key, pResult, pInfo->aggSup.resultRowSize); - releaseOutputBuf(pTaskInfo, &key, pResult); - int32_t prevEndPos = (forwardRows - 1) * step + startPos; - ASSERT(pSDataBlock->info.window.skey > 0 && pSDataBlock->info.window.ekey > 0); - startPos = - getNextQualifiedWindow(&pInfo->interval, &nextWin, &pSDataBlock->info, tsCols, prevEndPos, TSDB_ORDER_ASC); - if (startPos < 0) { - break; - } - } -} - -void doBuildResult(SOperatorInfo* pOperator, SSDataBlock* pBlock, SGroupResInfo* pGroupResInfo) { - SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - // set output datablock version - pBlock->info.version = pTaskInfo->version; - - blockDataCleanup(pBlock); - if (!hasRemainResults(pGroupResInfo)) { - return; - } - - // clear the existed group id - pBlock->info.groupId = 0; - buildDataBlockFromGroupRes(pTaskInfo, pBlock, &pOperator->exprSupp, pGroupResInfo); -} - static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { SStreamIntervalOperatorInfo* pInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -5772,12 +5627,13 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { return pInfo->pDelRes; } - doBuildResult(pOperator, pInfo->binfo.pRes, &pInfo->groupResInfo); + doBuildResult(pOperator, pInfo->pState, pInfo->binfo.pRes, &pInfo->groupResInfo); if (pInfo->binfo.pRes->info.rows > 0) { printDataBlock(pInfo->binfo.pRes, "single interval"); return pInfo->binfo.pRes; } - + deleteIntervalDiscBuf(pInfo->pState, NULL, pInfo->twAggSup.maxTs - pInfo->twAggSup.deleteMark, &pInfo->interval, + &pInfo->delKey); doSetOperatorCompleted(pOperator); return NULL; } @@ -5800,8 +5656,6 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { qDebug("%s clear existed time window results for updates checked", GET_TASKID(pTaskInfo)); continue; } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) { - // doDeleteSpecifyIntervalWindow(&pInfo->aggSup, &pInfo->twAggSup, pBlock, pInfo->pDelWins, &pInfo->interval, - // pUpdatedMap); doDeleteWindows(pOperator, &pInfo->interval, pOperator->exprSupp.numOfExprs, pBlock, pInfo->pDelWins, pUpdatedMap); continue; @@ -5830,9 +5684,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { maxTs = TMAX(maxTs, pBlock->info.window.ekey); minTs = TMIN(minTs, pBlock->info.window.skey); - // doStreamIntervalAggImpl(pOperator, &pInfo->binfo.resultRowInfo, pBlock, MAIN_SCAN, pUpdatedMap); - // new disc buf - doStreamIntervalAggImpl2(pOperator, pBlock, pBlock->info.groupId, pUpdatedMap); + doStreamIntervalAggImpl(pOperator, pBlock, pBlock->info.groupId, pUpdatedMap); } pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, maxTs); pInfo->twAggSup.minTs = TMIN(pInfo->twAggSup.minTs, minTs); @@ -5857,7 +5709,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { return pInfo->pDelRes; } - doBuildResult(pOperator, pInfo->binfo.pRes, &pInfo->groupResInfo); + doBuildResult(pOperator, pInfo->pState, pInfo->binfo.pRes, &pInfo->groupResInfo); if (pInfo->binfo.pRes->info.rows > 0) { printDataBlock(pInfo->binfo.pRes, "single interval"); return pInfo->binfo.pRes; @@ -5866,20 +5718,6 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { return NULL; } -void destroyStreamIntervalOperatorInfo(void* param) { - SStreamIntervalOperatorInfo* pInfo = (SStreamIntervalOperatorInfo*)param; - cleanupBasicInfo(&pInfo->binfo); - cleanupAggSup(&pInfo->aggSup); - pInfo->pRecycledPages = taosArrayDestroy(pInfo->pRecycledPages); - - pInfo->pDelWins = taosArrayDestroy(pInfo->pDelWins); - pInfo->pDelRes = blockDataDestroy(pInfo->pDelRes); - - cleanupGroupResInfo(&pInfo->groupResInfo); - colDataDestroy(&pInfo->twAggSup.timeWindowData); - taosMemoryFreeClear(param); -} - SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo) { SStreamIntervalOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamIntervalOperatorInfo)); @@ -5938,20 +5776,35 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window); pInfo->invertible = allInvertible(pSup->pCtx, numOfCols); - pInfo->invertible = false; // Todo(liuyao): Dependent TSDB API - pInfo->pRecycledPages = taosArrayInit(4, sizeof(int32_t)); + pInfo->invertible = false; pInfo->pDelWins = taosArrayInit(4, sizeof(SWinKey)); pInfo->delIndex = 0; pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT); initResultRowInfo(&pInfo->binfo.resultRowInfo); + pInfo->pState = taosMemoryCalloc(1, sizeof(SStreamState)); + *(pInfo->pState) = *(pTaskInfo->streamInfo.pState); + streamStateSetNumber(pInfo->pState, -1); + + pInfo->pUpdateRes = NULL; + pInfo->returnUpdate = false; + pInfo->pPhyNode = NULL; // create new child + pInfo->pPullDataMap = NULL; + pInfo->pPullWins = NULL; // SPullWindowInfo + pInfo->pullIndex = 0; + pInfo->pPullDataRes = NULL; + pInfo->isFinal = false; + pInfo->pChildren = NULL; + pInfo->delKey.ts = INT64_MAX; + pInfo->delKey.groupId = 0; + pOperator->name = "StreamIntervalOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL; pOperator->blocking = true; pOperator->status = OP_NOT_OPENED; pOperator->info = pInfo; pOperator->fpSet = - createOperatorFpSet(operatorDummyOpenFn, doStreamIntervalAgg, NULL, NULL, destroyStreamIntervalOperatorInfo, + createOperatorFpSet(operatorDummyOpenFn, doStreamIntervalAgg, NULL, NULL, destroyStreamFinalIntervalOperatorInfo, aggEncodeResultRow, aggDecodeResultRow, NULL); initIntervalDownStream(downstream, pPhyNode->type, &pInfo->aggSup, &pInfo->interval, &pInfo->twAggSup); @@ -5963,7 +5816,7 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys return pOperator; _error: - destroyStreamIntervalOperatorInfo(pInfo); + destroyStreamFinalIntervalOperatorInfo(pInfo); taosMemoryFreeClear(pOperator); pTaskInfo->code = code; return NULL; diff --git a/source/libs/stream/src/streamState.c b/source/libs/stream/src/streamState.c index 3428a85823..da0d0fbd6d 100644 --- a/source/libs/stream/src/streamState.c +++ b/source/libs/stream/src/streamState.c @@ -18,6 +18,37 @@ #include "tcommon.h" #include "ttimer.h" +// todo refactor +typedef struct SStateKey { + SWinKey key; + int64_t opNum; +} SStateKey; + +static inline int SStateKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, int kLen2) { + SStateKey* pWin1 = (SStateKey*)pKey1; + SStateKey* pWin2 = (SStateKey*)pKey2; + + if (pWin1->opNum > pWin2->opNum) { + return 1; + } else if (pWin1->opNum < pWin2->opNum) { + return -1; + } + + if (pWin1->key.ts > pWin2->key.ts) { + return 1; + } else if (pWin1->key.ts < pWin2->key.ts) { + return -1; + } + + if (pWin1->key.groupId > pWin2->key.groupId) { + return 1; + } else if (pWin1->key.groupId < pWin2->key.groupId) { + return -1; + } + + return 0; +} + SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath) { SStreamState* pState = taosMemoryCalloc(1, sizeof(SStreamState)); if (pState == NULL) { @@ -36,7 +67,7 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath) { } // open state storage backend - if (tdbTbOpen("state.db", sizeof(SWinKey), -1, SWinKeyCmpr, pState->db, &pState->pStateDb) < 0) { + if (tdbTbOpen("state.db", sizeof(SStateKey), -1, SStateKeyCmpr, pState->db, &pState->pStateDb) < 0) { goto _err; } @@ -130,8 +161,10 @@ int32_t streamStateFuncDel(SStreamState* pState, const STupleKey* key) { return tdbTbDelete(pState->pFuncStateDb, key, sizeof(STupleKey), &pState->txn); } +// todo refactor int32_t streamStatePut(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen) { - return tdbTbUpsert(pState->pStateDb, key, sizeof(SWinKey), value, vLen, &pState->txn); + SStateKey sKey = {.key = *key, .opNum = pState->number}; + return tdbTbUpsert(pState->pStateDb, &sKey, sizeof(SStateKey), value, vLen, &pState->txn); } // todo refactor @@ -139,8 +172,10 @@ int32_t streamStateFillPut(SStreamState* pState, const SWinKey* key, const void* return tdbTbUpsert(pState->pFillStateDb, key, sizeof(SWinKey), value, vLen, &pState->txn); } +// todo refactor int32_t streamStateGet(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen) { - return tdbTbGet(pState->pStateDb, key, sizeof(SWinKey), pVal, pVLen); + SStateKey sKey = {.key = *key, .opNum = pState->number}; + return tdbTbGet(pState->pStateDb, &sKey, sizeof(SStateKey), pVal, pVLen); } // todo refactor @@ -148,10 +183,30 @@ int32_t streamStateFillGet(SStreamState* pState, const SWinKey* key, void** pVal return tdbTbGet(pState->pFillStateDb, key, sizeof(SWinKey), pVal, pVLen); } +// todo refactor int32_t streamStateDel(SStreamState* pState, const SWinKey* key) { - return tdbTbDelete(pState->pStateDb, key, sizeof(SWinKey), &pState->txn); + SStateKey sKey = {.key = *key, .opNum = pState->number}; + return tdbTbDelete(pState->pStateDb, &sKey, sizeof(SStateKey), &pState->txn); } +int32_t streamStateClear(SStreamState* pState) { + SWinKey key = {.ts = 0, .groupId = 0}; + streamStatePut(pState, &key, NULL, 0); + while (1) { + SStreamStateCur* pCur = streamStateSeekKeyNext(pState, &key); + SWinKey delKey = {0}; + int32_t code = streamStateGetKVByCur(pCur, &delKey, NULL, 0); + if (code == 0) { + streamStateDel(pState, &delKey); + } else { + break; + } + } + return 0; +} + +void streamStateSetNumber(SStreamState* pState, int32_t number) { pState->number = number; } + // todo refactor int32_t streamStateFillDel(SStreamState* pState, const SWinKey* key) { return tdbTbDelete(pState->pFillStateDb, key, sizeof(SWinKey), &pState->txn); @@ -179,12 +234,14 @@ SStreamStateCur* streamStateGetCur(SStreamState* pState, const SWinKey* key) { if (pCur == NULL) return NULL; tdbTbcOpen(pState->pStateDb, &pCur->pCur, NULL); - int32_t c; + int32_t c; + SStateKey sKey = {.key = *key, .opNum = pState->number}; tdbTbcMoveTo(pCur->pCur, key, sizeof(SWinKey), &c); if (c != 0) { taosMemoryFree(pCur); return NULL; } + pCur->number = pState->number; return pCur; } @@ -214,6 +271,25 @@ SStreamStateCur* streamStateGetAndCheckCur(SStreamState* pState, SWinKey* key) { } int32_t streamStateGetKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen) { + if (!pCur) { + return -1; + } + const SStateKey* pKTmp = NULL; + int32_t kLen; + if (tdbTbcGet(pCur->pCur, (const void**)&pKTmp, &kLen, pVal, pVLen) < 0) { + return -1; + } + if (pKTmp->opNum != pCur->number) { + return -1; + } + *pKey = pKTmp->key; + return 0; +} + +int32_t streamStateFillGetKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen) { + if (!pCur) { + return -1; + } const SWinKey* pKTmp = NULL; int32_t kLen; if (tdbTbcGet(pCur->pCur, (const void**)&pKTmp, &kLen, pVal, pVLen) < 0) { @@ -225,7 +301,7 @@ int32_t streamStateGetKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** int32_t streamStateGetGroupKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen) { uint64_t groupId = pKey->groupId; - int32_t code = streamStateGetKVByCur(pCur, pKey, pVal, pVLen); + int32_t code = streamStateFillGetKVByCur(pCur, pKey, pVal, pVLen); if (code == 0) { if (pKey->groupId == groupId) { return 0; @@ -234,6 +310,16 @@ int32_t streamStateGetGroupKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const v return -1; } +int32_t streamStateGetFirst(SStreamState* pState, SWinKey* key) { + // todo refactor + SWinKey tmp = {.ts = 0, .groupId = 0}; + streamStatePut(pState, &tmp, NULL, 0); + SStreamStateCur* pCur = streamStateSeekKeyNext(pState, &tmp); + int32_t code = streamStateGetKVByCur(pCur, key, NULL, 0); + streamStateDel(pState, &tmp); + return code; +} + int32_t streamStateSeekFirst(SStreamState* pState, SStreamStateCur* pCur) { // return tdbTbcMoveToFirst(pCur->pCur); @@ -244,6 +330,34 @@ int32_t streamStateSeekLast(SStreamState* pState, SStreamStateCur* pCur) { return tdbTbcMoveToLast(pCur->pCur); } +SStreamStateCur* streamStateSeekKeyNext(SStreamState* pState, const SWinKey* key) { + SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur)); + if (pCur == NULL) { + return NULL; + } + pCur->number = pState->number; + if (tdbTbcOpen(pState->pStateDb, &pCur->pCur, NULL) < 0) { + taosMemoryFree(pCur); + return NULL; + } + + SStateKey sKey = {.key = *key, .opNum = pState->number}; + int32_t c; + if (tdbTbcMoveTo(pCur->pCur, &sKey, sizeof(SStateKey), &c) < 0) { + tdbTbcClose(pCur->pCur); + taosMemoryFree(pCur); + return NULL; + } + if (c > 0) return pCur; + + if (tdbTbcMoveToNext(pCur->pCur) < 0) { + taosMemoryFree(pCur); + return NULL; + } + + return pCur; +} + SStreamStateCur* streamStateFillSeekKeyNext(SStreamState* pState, const SWinKey* key) { SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur)); if (pCur == NULL) { @@ -303,9 +417,15 @@ int32_t streamStateCurNext(SStreamState* pState, SStreamStateCur* pCur) { int32_t streamStateCurPrev(SStreamState* pState, SStreamStateCur* pCur) { // + if (!pCur) { + return -1; + } return tdbTbcMoveToPrev(pCur->pCur); } void streamStateFreeCur(SStreamStateCur* pCur) { + if (!pCur) { + return; + } tdbTbcClose(pCur->pCur); taosMemoryFree(pCur); } diff --git a/tests/script/tsim/stream/distributeInterval0.sim b/tests/script/tsim/stream/distributeInterval0.sim index 9b2e940556..1d58922928 100644 --- a/tests/script/tsim/stream/distributeInterval0.sim +++ b/tests/script/tsim/stream/distributeInterval0.sim @@ -33,7 +33,8 @@ if $data(2)[4] != ready then endi print ===== step2 - +sql drop stream if exists stream_t1; +sql drop database if exists test; sql create database test vgroups 4; sql use test; sql create stable st(ts timestamp, a int, b int , c int, d double) tags(ta int,tb int,tc int); From 145abcb17fdb648eb69919411a6e7a73da1c1968 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 30 Sep 2022 10:52:17 +0800 Subject: [PATCH 103/143] more --- source/dnode/vnode/src/tsdb/tsdbCommit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index 05e08b6bf4..995d7a3155 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -17,7 +17,7 @@ typedef enum { MEMORY_DATA_ITER = 0, STT_DATA_ITER } EDataIterT; -#define USE_STREAM_COMPRESSION 1 +#define USE_STREAM_COMPRESSION 0 typedef struct { SRBTreeNode n; From 3dbb7c435a4c666e9857b5127c5ed322da6c7ab2 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Fri, 30 Sep 2022 11:00:35 +0800 Subject: [PATCH 104/143] docs: add sub-tbname rule note for tcollector (#17167) --- docs/en/20-third-party/08-tcollector.md | 16 +++++++++++----- docs/zh/20-third-party/08-tcollector.md | 17 ++++++++++++----- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/docs/en/20-third-party/08-tcollector.md b/docs/en/20-third-party/08-tcollector.md index 16b73c2394..206b9dd23c 100644 --- a/docs/en/20-third-party/08-tcollector.md +++ b/docs/en/20-third-party/08-tcollector.md @@ -33,11 +33,12 @@ Wait for a few seconds and then use the TDengine CLI to query whether the corres ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - tcollector | 2022-04-20 12:44:49.604 | 88 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | - log | 2022-04-20 07:19:50.260 | 11 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | -Query OK, 2 row(s) in set (0.002679s) + name | +================================= + information_schema | + performance_schema | + tcollector | +Query OK, 3 rows in database (0.001647s) taos> use tcollector; Database changed. @@ -65,3 +66,8 @@ taos> show stables; proc.vmstat.pgmajfault | 2022-04-20 12:44:54.251 | 2 | 1 | 1 | ... ``` + +:::note + +- TDengine will automatically create unique IDs for sub-table names by the rule. +::: diff --git a/docs/zh/20-third-party/08-tcollector.md b/docs/zh/20-third-party/08-tcollector.md index 78d0b4a5df..b79e3ed2d1 100644 --- a/docs/zh/20-third-party/08-tcollector.md +++ b/docs/zh/20-third-party/08-tcollector.md @@ -34,11 +34,13 @@ sudo systemctl restart taosadapter ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - tcollector | 2022-04-20 12:44:49.604 | 88 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | - log | 2022-04-20 07:19:50.260 | 11 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | -Query OK, 2 row(s) in set (0.002679s) + name | +================================= + information_schema | + performance_schema | + tcollector | +Query OK, 3 rows in database (0.001647s) + taos> use tcollector; Database changed. @@ -66,3 +68,8 @@ taos> show stables; proc.vmstat.pgmajfault | 2022-04-20 12:44:54.251 | 2 | 1 | 1 | ... ``` + +:::note + +- TDengine 默认生成的子表名是根据规则生成的唯一 ID 值。 +::: From 55ffdaecd474844ec40100628d2463d2fe330bcb Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Fri, 30 Sep 2022 11:11:06 +0800 Subject: [PATCH 105/143] docs: fix show database output (#17169) * docs: add prometheus sub-table naming by rule note * docs: fix show databases output --- docs/en/20-third-party/02-prometheus.md | 13 ++++++------- docs/zh/20-third-party/02-prometheus.md | 13 ++++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/docs/en/20-third-party/02-prometheus.md b/docs/en/20-third-party/02-prometheus.md index c46b0381b9..49d701bd20 100644 --- a/docs/en/20-third-party/02-prometheus.md +++ b/docs/en/20-third-party/02-prometheus.md @@ -30,13 +30,12 @@ After restarting Prometheus, you can refer to the following example to verify th ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - test | 2022-04-12 08:07:58.756 | 1 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | - log | 2022-04-20 07:19:50.260 | 2 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | - prometheus_data | 2022-04-20 07:21:09.202 | 158 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | - db | 2022-04-15 06:37:08.512 | 1 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | -Query OK, 4 row(s) in set (0.000585s) + name | +================================= + information_schema | + performance_schema | + prometheus_data | +Query OK, 3 row(s) in set (0.000585s) taos> use prometheus_data; Database changed. diff --git a/docs/zh/20-third-party/02-prometheus.md b/docs/zh/20-third-party/02-prometheus.md index 59bab1823a..8b8d078792 100644 --- a/docs/zh/20-third-party/02-prometheus.md +++ b/docs/zh/20-third-party/02-prometheus.md @@ -29,13 +29,12 @@ Prometheus 提供了 `remote_write` 和 `remote_read` 接口来利用其它数 ### 使用 TDengine CLI 查询写入数据 ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - test | 2022-04-12 08:07:58.756 | 1 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | - log | 2022-04-20 07:19:50.260 | 2 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | - prometheus_data | 2022-04-20 07:21:09.202 | 158 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | - db | 2022-04-15 06:37:08.512 | 1 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | -Query OK, 4 row(s) in set (0.000585s) + name | +================================= + information_schema | + performance_schema | + prometheus_data | +Query OK, 3 row(s) in set (0.000585s) taos> use prometheus_data; Database changed. From c6317e67f0c61ab85c9e0c814643c2217391e9a0 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 30 Sep 2022 11:26:26 +0800 Subject: [PATCH 106/143] fix: coverity issues --- source/dnode/mnode/impl/src/mndCluster.c | 1 + source/dnode/mnode/impl/src/mndDb.c | 8 +++--- source/dnode/mnode/impl/src/mndDnode.c | 14 ++++++----- source/dnode/mnode/impl/src/mndFunc.c | 9 ++++--- source/dnode/mnode/impl/src/mndGrant.c | 28 ++++++++++----------- source/dnode/mnode/impl/src/mndMain.c | 2 +- source/dnode/mnode/impl/src/mndMnode.c | 11 +++++--- source/dnode/mnode/impl/src/mndPerfSchema.c | 6 ++--- source/dnode/mnode/impl/src/mndProfile.c | 4 +-- source/dnode/mnode/impl/src/mndSubscribe.c | 2 +- 10 files changed, 48 insertions(+), 37 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndCluster.c b/source/dnode/mnode/impl/src/mndCluster.c index 96748b3620..3502ecf604 100644 --- a/source/dnode/mnode/impl/src/mndCluster.c +++ b/source/dnode/mnode/impl/src/mndCluster.c @@ -237,6 +237,7 @@ static int32_t mndCreateDefaultCluster(SMnode *pMnode) { STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, NULL, "create-cluster"); if (pTrans == NULL) { + sdbFreeRaw(pRaw); mError("cluster:%" PRId64 ", failed to create since %s", clusterObj.id, terrstr()); return -1; } diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index a05d8dd739..1d70f43834 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -1594,7 +1594,7 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, break; } char precVstr[10] = {0}; - STR_WITH_SIZE_TO_VARSTR(precVstr, precStr, 2); + STR_WITH_MAXSIZE_TO_VARSTR(precVstr, precStr, 10); char *statusStr = "ready"; if (objStatus == SDB_STATUS_CREATING) { @@ -1607,7 +1607,7 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, } } char statusVstr[24] = {0}; - STR_WITH_SIZE_TO_VARSTR(statusVstr, statusStr, strlen(statusStr)); + STR_WITH_MAXSIZE_TO_VARSTR(statusVstr, statusStr, 24); if (sysDb || !sysinfo) { for (int32_t i = 0; i < pShow->numOfColumns; ++i) { @@ -1644,7 +1644,7 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, const char *strictStr = pDb->cfg.strict ? "on" : "off"; char strictVstr[24] = {0}; - STR_WITH_SIZE_TO_VARSTR(strictVstr, strictStr, strlen(strictStr)); + STR_WITH_MAXSIZE_TO_VARSTR(strictVstr, strictStr, 24); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, rows, (const char *)strictVstr, false); @@ -1704,7 +1704,7 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb, const char *cacheModelStr = getCacheModelStr(pDb->cfg.cacheLast); char cacheModelVstr[24] = {0}; - STR_WITH_SIZE_TO_VARSTR(cacheModelVstr, cacheModelStr, strlen(cacheModelStr)); + STR_WITH_MAXSIZE_TO_VARSTR(cacheModelVstr, cacheModelStr, 24); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, rows, (const char *)cacheModelVstr, false); diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 4a8436513f..c8995eb6bc 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -102,7 +102,7 @@ static int32_t mndCreateDefaultDnode(SMnode *pMnode) { dnodeObj.updateTime = dnodeObj.createdTime; dnodeObj.port = tsServerPort; memcpy(&dnodeObj.fqdn, tsLocalFqdn, TSDB_FQDN_LEN); - snprintf(dnodeObj.ep, TSDB_EP_LEN, "%s:%u", dnodeObj.fqdn, dnodeObj.port); + snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", dnodeObj.fqdn, dnodeObj.port); pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, NULL, "create-dnode"); if (pTrans == NULL) goto _OVER; @@ -190,7 +190,7 @@ _OVER: static int32_t mndDnodeActionInsert(SSdb *pSdb, SDnodeObj *pDnode) { mTrace("dnode:%d, perform insert action, row:%p", pDnode->id, pDnode); pDnode->offlineReason = DND_REASON_STATUS_NOT_RECEIVED; - snprintf(pDnode->ep, TSDB_EP_LEN, "%s:%u", pDnode->fqdn, pDnode->port); + snprintf(pDnode->ep, TSDB_EP_LEN - 1, "%s:%u", pDnode->fqdn, pDnode->port); return 0; } @@ -253,7 +253,7 @@ int32_t mndGetDnodeSize(SMnode *pMnode) { bool mndIsDnodeOnline(SDnodeObj *pDnode, int64_t curMs) { int64_t interval = TABS(pDnode->lastAccessTime - curMs); - if (interval > 5000 * tsStatusInterval) { + if (interval > 5000 * (int64_t)tsStatusInterval) { if (pDnode->rebootTime > 0) { pDnode->offlineReason = DND_REASON_STATUS_MSG_TIMEOUT; } @@ -486,7 +486,7 @@ static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pC dnodeObj.updateTime = dnodeObj.createdTime; dnodeObj.port = pCreate->port; memcpy(dnodeObj.fqdn, pCreate->fqdn, TSDB_FQDN_LEN); - snprintf(dnodeObj.ep, TSDB_EP_LEN, "%s:%u", dnodeObj.fqdn, dnodeObj.port); + snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", dnodeObj.fqdn, dnodeObj.port); pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_GLOBAL, pReq, "create-dnode"); if (pTrans == NULL) goto _OVER; @@ -673,12 +673,14 @@ static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SM mInfo("trans:%d, used to drop dnode:%d", pTrans->id, pDnode->id); pRaw = mndDnodeActionEncode(pDnode); - if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) goto _OVER; + if (pRaw == NULL) goto _OVER; + if (mndTransAppendRedolog(pTrans, pRaw) != 0) goto _OVER; sdbSetRawStatus(pRaw, SDB_STATUS_DROPPING); pRaw = NULL; pRaw = mndDnodeActionEncode(pDnode); - if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; + if (pRaw == NULL) goto _OVER; + if (mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); pRaw = NULL; diff --git a/source/dnode/mnode/impl/src/mndFunc.c b/source/dnode/mnode/impl/src/mndFunc.c index 727f7b0cc9..ccab4774e2 100644 --- a/source/dnode/mnode/impl/src/mndFunc.c +++ b/source/dnode/mnode/impl/src/mndFunc.c @@ -257,15 +257,18 @@ static int32_t mndDropFunc(SMnode *pMnode, SRpcMsg *pReq, SFuncObj *pFunc) { mInfo("trans:%d, used to drop user:%s", pTrans->id, pFunc->name); SSdbRaw *pRedoRaw = mndFuncActionEncode(pFunc); - if (pRedoRaw == NULL || mndTransAppendRedolog(pTrans, pRedoRaw) != 0) goto _OVER; + if (pRedoRaw == NULL) goto _OVER; + if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) goto _OVER; sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING); SSdbRaw *pUndoRaw = mndFuncActionEncode(pFunc); - if (pUndoRaw == NULL || mndTransAppendUndolog(pTrans, pUndoRaw) != 0) goto _OVER; + if (pUndoRaw == NULL) goto _OVER; + if (mndTransAppendUndolog(pTrans, pUndoRaw) != 0) goto _OVER; sdbSetRawStatus(pUndoRaw, SDB_STATUS_READY); SSdbRaw *pCommitRaw = mndFuncActionEncode(pFunc); - if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) goto _OVER; + if (pCommitRaw == NULL) goto _OVER; + if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) goto _OVER; sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED); if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER; diff --git a/source/dnode/mnode/impl/src/mndGrant.c b/source/dnode/mnode/impl/src/mndGrant.c index a608a1e40f..7262f23657 100644 --- a/source/dnode/mnode/impl/src/mndGrant.c +++ b/source/dnode/mnode/impl/src/mndGrant.c @@ -30,85 +30,85 @@ static int32_t mndRetrieveGrant(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl cols = 0; SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols); const char *src = "community"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "false"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); cols++; pColInfo = taosArrayGet(pBlock->pDataBlock, cols); src = "unlimited"; - STR_WITH_SIZE_TO_VARSTR(tmp, src, strlen(src)); + STR_WITH_MAXSIZE_TO_VARSTR(tmp, src, 32); colDataAppend(pColInfo, numOfRows, tmp, false); numOfRows++; diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index a628cefa65..b3b9927a34 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -649,7 +649,7 @@ int32_t mndProcessRpcMsg(SRpcMsg *pMsg) { void mndSetMsgHandle(SMnode *pMnode, tmsg_t msgType, MndMsgFp fp) { tmsg_t type = TMSG_INDEX(msgType); - if (type >= 0 && type < TDMT_MAX) { + if (type < TDMT_MAX) { pMnode->msgFp[type] = fp; } } diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c index a41f958c0f..cfb362c51c 100644 --- a/source/dnode/mnode/impl/src/mndMnode.c +++ b/source/dnode/mnode/impl/src/mndMnode.c @@ -93,6 +93,7 @@ static int32_t mndCreateDefaultMnode(SMnode *pMnode) { STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, NULL, "create-mnode"); if (pTrans == NULL) { + sdbFreeRaw(pRaw); mError("mnode:%d, failed to create since %s", mnodeObj.id, terrstr()); return -1; } @@ -220,8 +221,12 @@ bool mndIsMnode(SMnode *pMnode, int32_t dnodeId) { void mndGetMnodeEpSet(SMnode *pMnode, SEpSet *pEpSet) { SSdb *pSdb = pMnode->pSdb; int32_t totalMnodes = sdbGetSize(pSdb, SDB_MNODE); - void *pIter = NULL; + if (totalMnodes == 0) { + syncGetRetryEpSet(pMnode->syncMgmt.sync, pEpSet); + return; + } + void *pIter = NULL; while (1) { SMnodeObj *pObj = NULL; pIter = sdbFetch(pSdb, SDB_MNODE, pIter, (void **)&pObj); @@ -658,7 +663,7 @@ static int32_t mndRetrieveMnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB colDataAppend(pColInfo, numOfRows, (const char *)&pObj->id, false); char b1[TSDB_EP_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(b1, pObj->pDnode->ep, pShow->pMeta->pSchemas[cols].bytes); + STR_WITH_MAXSIZE_TO_VARSTR(b1, pObj->pDnode->ep, TSDB_EP_LEN + VARSTR_HEADER_SIZE); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, b1, false); @@ -667,7 +672,7 @@ static int32_t mndRetrieveMnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB if (pObj->id == pMnode->selfDnodeId) { roles = syncStr(TAOS_SYNC_STATE_LEADER); } - if (pObj->pDnode && mndIsDnodeOnline(pObj->pDnode, curMs)) { + if (mndIsDnodeOnline(pObj->pDnode, curMs)) { roles = syncStr(pObj->state); if (pObj->state == TAOS_SYNC_STATE_LEADER && pObj->id != pMnode->selfDnodeId) { roles = syncStr(TAOS_SYNC_STATE_ERROR); diff --git a/source/dnode/mnode/impl/src/mndPerfSchema.c b/source/dnode/mnode/impl/src/mndPerfSchema.c index fe8d1a0a0e..cb636dc037 100644 --- a/source/dnode/mnode/impl/src/mndPerfSchema.c +++ b/source/dnode/mnode/impl/src/mndPerfSchema.c @@ -26,7 +26,7 @@ int32_t mndInitPerfsTableSchema(const SSysDbTableSchema *pSrc, int32_t colNum, S } for (int32_t i = 0; i < colNum; ++i) { - strcpy(schema[i].name, pSrc[i].name); + tstrncpy(schema[i].name, pSrc[i].name, sizeof(schema[i].name)); schema[i].type = pSrc[i].type; schema[i].colId = i + 1; @@ -40,7 +40,7 @@ int32_t mndInitPerfsTableSchema(const SSysDbTableSchema *pSrc, int32_t colNum, S int32_t mndPerfsInitMeta(SHashObj *hash) { STableMetaRsp meta = {0}; - strcpy(meta.dbFName, TSDB_INFORMATION_SCHEMA_DB); + tstrncpy(meta.dbFName, TSDB_INFORMATION_SCHEMA_DB, sizeof(meta.dbFName)); meta.tableType = TSDB_SYSTEM_TABLE; meta.sversion = 1; meta.tversion = 1; @@ -50,7 +50,7 @@ int32_t mndPerfsInitMeta(SHashObj *hash) { getPerfDbMeta(&pSysDbTableMeta, &size); for (int32_t i = 0; i < size; ++i) { - strcpy(meta.tbName, pSysDbTableMeta[i].name); + tstrncpy(meta.tbName, pSysDbTableMeta[i].name, sizeof(meta.tbName)); meta.numOfColumns = pSysDbTableMeta[i].colNum; if (mndInitPerfsTableSchema(pSysDbTableMeta[i].schema, pSysDbTableMeta[i].colNum, &meta.pSchemas)) { diff --git a/source/dnode/mnode/impl/src/mndProfile.c b/source/dnode/mnode/impl/src/mndProfile.c index e8737e30c9..1909b168bd 100644 --- a/source/dnode/mnode/impl/src/mndProfile.c +++ b/source/dnode/mnode/impl/src/mndProfile.c @@ -664,7 +664,7 @@ static int32_t mndProcessKillConnReq(SRpcMsg *pReq) { static int32_t mndProcessSvrVerReq(SRpcMsg *pReq) { int32_t code = -1; SServerVerRsp rsp = {0}; - strcpy(rsp.ver, version); + tstrncpy(rsp.ver, version, sizeof(rsp.ver)); int32_t contLen = tSerializeSServerVerRsp(NULL, 0, &rsp); if (contLen < 0) goto _over; @@ -702,7 +702,7 @@ static int32_t mndRetrieveConns(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl break; } - if ((taosGetTimestampMs() - pConn->lastAccessTimeMs) > (keepTime * 1000)) { + if ((taosGetTimestampMs() - pConn->lastAccessTimeMs) > ((int64_t)keepTime * 1000)) { continue; } diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c index 21e45407fd..f2fec27bc5 100644 --- a/source/dnode/mnode/impl/src/mndSubscribe.c +++ b/source/dnode/mnode/impl/src/mndSubscribe.c @@ -123,7 +123,7 @@ static int32_t mndBuildSubChangeReq(void **pBuf, int32_t *pLen, const SMqSubscri req.subType = pSub->subType; req.withMeta = pSub->withMeta; req.suid = pSub->stbUid; - strncpy(req.subKey, pSub->key, TSDB_SUBSCRIBE_KEY_LEN); + tstrncpy(req.subKey, pSub->key, TSDB_SUBSCRIBE_KEY_LEN); int32_t tlen = sizeof(SMsgHead) + tEncodeSMqRebVgReq(NULL, &req); void *buf = taosMemoryMalloc(tlen); From 3a9dee68cb21c519b2288d470c6385ce92aa6ec5 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 30 Sep 2022 11:30:07 +0800 Subject: [PATCH 107/143] opt tbname in --- source/libs/index/src/indexTfile.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/libs/index/src/indexTfile.c b/source/libs/index/src/indexTfile.c index 1fc631e9f3..f3009c051b 100644 --- a/source/libs/index/src/indexTfile.c +++ b/source/libs/index/src/indexTfile.c @@ -555,6 +555,7 @@ int tfileWriterPut(TFileWriter* tw, void* data, bool order) { taosArraySort(v->tableId, idxUidCompare); taosArrayRemoveDuplicate(v->tableId, idxUidCompare, NULL); int32_t tbsz = taosArrayGetSize(v->tableId); + if (tbsz == 0) continue; fstOffset += TF_TABLE_TATOAL_SIZE(tbsz); } tfileWriteFstOffset(tw, fstOffset); @@ -566,6 +567,7 @@ int tfileWriterPut(TFileWriter* tw, void* data, bool order) { TFileValue* v = taosArrayGetP((SArray*)data, i); int32_t tbsz = taosArrayGetSize(v->tableId); + if (tbsz == 0) continue; // check buf has enough space or not int32_t ttsz = TF_TABLE_TATOAL_SIZE(tbsz); @@ -592,6 +594,10 @@ int tfileWriterPut(TFileWriter* tw, void* data, bool order) { for (size_t i = 0; i < sz; i++) { // TODO, fst batch write later TFileValue* v = taosArrayGetP((SArray*)data, i); + + int32_t tbsz = taosArrayGetSize(v->tableId); + if (tbsz == 0) continue; + if (tfileWriteData(tw, v) != 0) { indexError("failed to write data: %s, offset: %d len: %d", v->colVal, v->offset, (int)taosArrayGetSize(v->tableId)); From 86ca19f4d42fecdec6fcb4f73357c060cd05d4f9 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Fri, 30 Sep 2022 11:58:30 +0800 Subject: [PATCH 108/143] docs: sub-tbname rule note and fix show stables output (#17171) --- .../03-insert-data/03-opentsdb-telnet.mdx | 8 ++-- .../03-insert-data/04-opentsdb-json.mdx | 8 ++-- .../03-connector/_verify_linux.mdx | 10 ++-- .../03-connector/_verify_windows.mdx | 11 ++--- docs/en/14-reference/11-docker/index.md | 9 ++-- docs/en/14-reference/_statsd.mdx | 1 + docs/en/20-third-party/02-prometheus.md | 6 +-- docs/en/20-third-party/03-telegraf.md | 20 ++++---- docs/en/20-third-party/05-collectd.md | 35 +++++++------- docs/en/20-third-party/06-statsd.md | 24 ++++++---- docs/en/20-third-party/07-icinga2.md | 48 +++++++++---------- docs/en/20-third-party/08-tcollector.md | 40 ++++++++-------- .../03-insert-data/03-opentsdb-telnet.mdx | 8 ++-- .../03-insert-data/04-opentsdb-json.mdx | 8 ++-- docs/zh/08-connector/_verify_linux.mdx | 10 ++-- docs/zh/14-reference/_statsd.mdx | 1 + docs/zh/20-third-party/02-prometheus.md | 6 +-- docs/zh/20-third-party/03-telegraf.md | 20 ++++---- docs/zh/20-third-party/05-collectd.md | 35 +++++++------- docs/zh/20-third-party/06-statsd.md | 24 ++++++---- docs/zh/20-third-party/07-icinga2.md | 48 +++++++++---------- docs/zh/20-third-party/08-tcollector.md | 40 ++++++++-------- 22 files changed, 218 insertions(+), 202 deletions(-) diff --git a/docs/en/07-develop/03-insert-data/03-opentsdb-telnet.mdx b/docs/en/07-develop/03-insert-data/03-opentsdb-telnet.mdx index d88a6335cb..a71efde735 100644 --- a/docs/en/07-develop/03-insert-data/03-opentsdb-telnet.mdx +++ b/docs/en/07-develop/03-insert-data/03-opentsdb-telnet.mdx @@ -64,10 +64,10 @@ taos> use test; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - meters.current | 2022-03-30 17:04:10.877 | 2 | 2 | 2 | - meters.voltage | 2022-03-30 17:04:10.882 | 2 | 2 | 2 | + name | +================================= + meters.current | + meters.voltage | Query OK, 2 row(s) in set (0.002544s) taos> select tbname, * from `meters.current`; diff --git a/docs/en/07-develop/03-insert-data/04-opentsdb-json.mdx b/docs/en/07-develop/03-insert-data/04-opentsdb-json.mdx index e2e6d6fc9f..c0a287e331 100644 --- a/docs/en/07-develop/03-insert-data/04-opentsdb-json.mdx +++ b/docs/en/07-develop/03-insert-data/04-opentsdb-json.mdx @@ -81,10 +81,10 @@ taos> use test; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - meters.current | 2022-03-29 16:05:25.193 | 2 | 2 | 1 | - meters.voltage | 2022-03-29 16:05:25.200 | 2 | 2 | 1 | + name | +================================= + meters.current | + meters.voltage | Query OK, 2 row(s) in set (0.001954s) taos> select * from `meters.current`; diff --git a/docs/en/14-reference/03-connector/_verify_linux.mdx b/docs/en/14-reference/03-connector/_verify_linux.mdx index 3438b1578e..220fccfef3 100644 --- a/docs/en/14-reference/03-connector/_verify_linux.mdx +++ b/docs/en/14-reference/03-connector/_verify_linux.mdx @@ -4,11 +4,11 @@ Execute TDengine CLI program `taos` directly from the Linux shell to connect to $ taos taos> show databases; - name | create_time | vgroups | ntables | replica | strict | duration | keep | buffer | pagesize | pages | minrows | maxrows | comp | precision | status | retention | single_stable | cachemodel | cachesize | wal_level | wal_fsync_period | wal_retention_period | wal_retention_size | wal_roll_period | wal_seg_size | -========================================================================================================================================================================================================================================================================================================================================================================================================================================================================= - information_schema | NULL | NULL | 14 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | ready | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | - performance_schema | NULL | NULL | 3 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | ready | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | - db | 2022-08-04 14:14:49.385 | 2 | 4 | 1 | off | 14400m | 5254560m,5254560m,5254560m | 96 | 4 | 256 | 100 | 4096 | 2 | ms | ready | NULL | false | none | 1 | 1 | 3000 | 0 | 0 | 0 | 0 | + name | +================================= + information_schema | + performance_schema | + db | Query OK, 3 rows in database (0.019154s) taos> diff --git a/docs/en/14-reference/03-connector/_verify_windows.mdx b/docs/en/14-reference/03-connector/_verify_windows.mdx index 402b170511..65d10f0875 100644 --- a/docs/en/14-reference/03-connector/_verify_windows.mdx +++ b/docs/en/14-reference/03-connector/_verify_windows.mdx @@ -2,12 +2,11 @@ Go to the `C:\TDengine` directory from `cmd` and execute TDengine CLI program `t ```text taos> show databases; - name | create_time | vgroups | ntables | replica | strict | duration | keep | buffer | pagesize | pages | minrows | maxrows | comp | precision | status | retention | single_stable | cachemodel | cachesize | wal_level | wal_fsync_period | wal_retention_period | wal_retention_size | wal_roll_period | wal_seg_size | -========================================================================================================================================================================================================================================================================================================================================================================================================================================================================= - information_schema | NULL | NULL | 14 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | ready | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | - performance_schema | NULL | NULL | 3 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | ready | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | - test | 2022-08-04 16:46:40.506 | 2 | 0 | 1 | off | 14400m | 5256000m,5256000m,5256000m | 96 | 4 | 256 | -100 | 4096 | 2 | ms | ready | NULL | false | none | 1 | 1 | 3000 | 0 | 0 | 0 | 0 | + name | +================================= + information_schema | + performance_schema | + test | Query OK, 3 rows in database (0.123000s) taos> diff --git a/docs/en/14-reference/11-docker/index.md b/docs/en/14-reference/11-docker/index.md index 7cd1e810dc..89987c456f 100644 --- a/docs/en/14-reference/11-docker/index.md +++ b/docs/en/14-reference/11-docker/index.md @@ -25,10 +25,11 @@ The TDengine client taos can be executed in this container to access TDengine us $ docker exec -it tdengine taos taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - log | 2022-01-17 13:57:22.270 | 10 | 1 | 1 | 1 | 10 | 30 | 1 | 3 | 100 | 4096 | 1 | 3000 | 2 | 0 | us | 0 | ready | -Query OK, 1 row(s) in set (0.002843s) + name | +================================= + information_schema | + performance_schema | +Query OK, 2 row(s) in set (0.002843s) ``` The TDengine server running in the container uses the container's hostname to establish a connection. Using TDengine CLI or various connectors (such as JDBC-JNI) to access the TDengine inside the container from outside the container is more complicated. So the above is the simplest way to access the TDengine service in the container and is suitable for some simple scenarios. Please refer to the next section if you want to access the TDengine service in the container from outside the container using TDengine CLI or various connectors for complex scenarios. diff --git a/docs/en/14-reference/_statsd.mdx b/docs/en/14-reference/_statsd.mdx index d0721a16fb..d068304a1d 100644 --- a/docs/en/14-reference/_statsd.mdx +++ b/docs/en/14-reference/_statsd.mdx @@ -51,5 +51,6 @@ port: 8125 Start StatsD after adding the following (assuming the config file is modified to config.js) ``` +npm install node stats.js config.js & ``` diff --git a/docs/en/20-third-party/02-prometheus.md b/docs/en/20-third-party/02-prometheus.md index 49d701bd20..ef9b9cb637 100644 --- a/docs/en/20-third-party/02-prometheus.md +++ b/docs/en/20-third-party/02-prometheus.md @@ -41,9 +41,9 @@ taos> use prometheus_data; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - metrics | 2022-04-20 07:21:09.209 | 2 | 1 | 1389 | + name | +================================= + metrics | Query OK, 1 row(s) in set (0.000487s) taos> select * from metrics limit 10; diff --git a/docs/en/20-third-party/03-telegraf.md b/docs/en/20-third-party/03-telegraf.md index ab06ab0379..8f3cab0e57 100644 --- a/docs/en/20-third-party/03-telegraf.md +++ b/docs/en/20-third-party/03-telegraf.md @@ -43,16 +43,16 @@ taos> use telegraf; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - swap | 2022-04-20 08:47:53.532 | 7 | 1 | 1 | - cpu | 2022-04-20 08:48:03.488 | 11 | 2 | 5 | - system | 2022-04-20 08:47:53.512 | 8 | 1 | 1 | - diskio | 2022-04-20 08:47:53.550 | 12 | 2 | 15 | - kernel | 2022-04-20 08:47:53.503 | 6 | 1 | 1 | - mem | 2022-04-20 08:47:53.521 | 35 | 1 | 1 | - processes | 2022-04-20 08:47:53.555 | 12 | 1 | 1 | - disk | 2022-04-20 08:47:53.541 | 8 | 5 | 2 | + name | +================================= + swap | + cpu | + system | + diskio | + kernel | + mem | + processes | + disk | Query OK, 8 row(s) in set (0.000521s) taos> select * from telegraf.system limit 10; diff --git a/docs/en/20-third-party/05-collectd.md b/docs/en/20-third-party/05-collectd.md index 295c08c307..5b52e3b7bc 100644 --- a/docs/en/20-third-party/05-collectd.md +++ b/docs/en/20-third-party/05-collectd.md @@ -32,28 +32,29 @@ Use the TDengine CLI to verify that collectd's data is written to TDengine and c ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - collectd | 2022-04-20 09:27:45.460 | 95 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | - log | 2022-04-20 07:19:50.260 | 11 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | -Query OK, 2 row(s) in set (0.003266s) + name | +================================= + information_schema | + performance_schema | + collectd | +Query OK, 3 row(s) in set (0.003266s) taos> use collectd; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - load_1 | 2022-04-20 09:27:45.492 | 2 | 2 | 1 | - memory_value | 2022-04-20 09:27:45.463 | 2 | 3 | 6 | - df_value | 2022-04-20 09:27:45.463 | 2 | 4 | 25 | - load_2 | 2022-04-20 09:27:45.501 | 2 | 2 | 1 | - load_0 | 2022-04-20 09:27:45.485 | 2 | 2 | 1 | - interface_1 | 2022-04-20 09:27:45.488 | 2 | 3 | 12 | - irq_value | 2022-04-20 09:27:45.476 | 2 | 3 | 31 | - interface_0 | 2022-04-20 09:27:45.480 | 2 | 3 | 12 | - entropy_value | 2022-04-20 09:27:45.473 | 2 | 2 | 1 | - swap_value | 2022-04-20 09:27:45.477 | 2 | 3 | 5 | + name | +================================= + load_1 | + memory_value | + df_value | + load_2 | + load_0 | + interface_1 | + irq_value | + interface_0 | + entropy_value | + swap_value | Query OK, 10 row(s) in set (0.002236s) taos> select * from collectd.memory_value limit 10; diff --git a/docs/en/20-third-party/06-statsd.md b/docs/en/20-third-party/06-statsd.md index 32b1bbb97a..b861a48ecd 100644 --- a/docs/en/20-third-party/06-statsd.md +++ b/docs/en/20-third-party/06-statsd.md @@ -26,7 +26,7 @@ Start StatsD: ``` $ node stats.js config.js & [1] 8546 -$ 20 Apr 09:54:41 - [8546] reading config file: exampleConfig.js +$ 20 Apr 09:54:41 - [8546] reading config file: config.js 20 Apr 09:54:41 - server is up INFO ``` @@ -40,19 +40,20 @@ Use the TDengine CLI to verify that StatsD data is written to TDengine and can r ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - log | 2022-04-20 07:19:50.260 | 11 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | - statsd | 2022-04-20 09:54:51.220 | 1 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | -Query OK, 2 row(s) in set (0.003142s) + name | +================================= + information_schema | + performance_schema | + statsd | +Query OK, 3 row(s) in set (0.003142s) taos> use statsd; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - foo | 2022-04-20 09:54:51.234 | 2 | 1 | 1 | + name | +================================= + foo | Query OK, 1 row(s) in set (0.002161s) taos> select * from foo; @@ -63,3 +64,8 @@ Query OK, 1 row(s) in set (0.004179s) taos> ``` + +:::note + +- TDengine will automatically create unique IDs for sub-table names by the rule. +::: diff --git a/docs/en/20-third-party/07-icinga2.md b/docs/en/20-third-party/07-icinga2.md index e98f209803..167b6a4303 100644 --- a/docs/en/20-third-party/07-icinga2.md +++ b/docs/en/20-third-party/07-icinga2.md @@ -47,30 +47,30 @@ taos> use icinga2; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - icinga.service.users.state_... | 2022-04-20 12:11:39.726 | 2 | 1 | 1 | - icinga.service.users.acknow... | 2022-04-20 12:11:39.756 | 2 | 1 | 1 | - icinga.service.procs.downti... | 2022-04-20 12:11:44.541 | 2 | 1 | 1 | - icinga.service.users.users | 2022-04-20 12:11:39.770 | 2 | 1 | 1 | - icinga.service.procs.procs_min | 2022-04-20 12:11:44.599 | 2 | 1 | 1 | - icinga.service.users.users_min | 2022-04-20 12:11:39.809 | 2 | 1 | 1 | - icinga.check.max_check_atte... | 2022-04-20 12:11:39.847 | 2 | 3 | 2 | - icinga.service.procs.state_... | 2022-04-20 12:11:44.522 | 2 | 1 | 1 | - icinga.service.procs.procs_... | 2022-04-20 12:11:44.576 | 2 | 1 | 1 | - icinga.service.users.users_... | 2022-04-20 12:11:39.796 | 2 | 1 | 1 | - icinga.check.latency | 2022-04-20 12:11:39.869 | 2 | 3 | 2 | - icinga.service.procs.procs_... | 2022-04-20 12:11:44.588 | 2 | 1 | 1 | - icinga.service.users.downti... | 2022-04-20 12:11:39.746 | 2 | 1 | 1 | - icinga.service.users.users_... | 2022-04-20 12:11:39.783 | 2 | 1 | 1 | - icinga.service.users.reachable | 2022-04-20 12:11:39.736 | 2 | 1 | 1 | - icinga.service.procs.procs | 2022-04-20 12:11:44.565 | 2 | 1 | 1 | - icinga.service.procs.acknow... | 2022-04-20 12:11:44.554 | 2 | 1 | 1 | - icinga.service.procs.state | 2022-04-20 12:11:44.509 | 2 | 1 | 1 | - icinga.service.procs.reachable | 2022-04-20 12:11:44.532 | 2 | 1 | 1 | - icinga.check.current_attempt | 2022-04-20 12:11:39.825 | 2 | 3 | 2 | - icinga.check.execution_time | 2022-04-20 12:11:39.898 | 2 | 3 | 2 | - icinga.service.users.state | 2022-04-20 12:11:39.704 | 2 | 1 | 1 | + name | +================================= + icinga.service.users.state_... | + icinga.service.users.acknow... | + icinga.service.procs.downti... | + icinga.service.users.users | + icinga.service.procs.procs_min | + icinga.service.users.users_min | + icinga.check.max_check_atte... | + icinga.service.procs.state_... | + icinga.service.procs.procs_... | + icinga.service.users.users_... | + icinga.check.latency | + icinga.service.procs.procs_... | + icinga.service.users.downti... | + icinga.service.users.users_... | + icinga.service.users.reachable | + icinga.service.procs.procs | + icinga.service.procs.acknow... | + icinga.service.procs.state | + icinga.service.procs.reachable | + icinga.check.current_attempt | + icinga.check.execution_time | + icinga.service.users.state | Query OK, 22 row(s) in set (0.002317s) ``` diff --git a/docs/en/20-third-party/08-tcollector.md b/docs/en/20-third-party/08-tcollector.md index 206b9dd23c..b604a2d712 100644 --- a/docs/en/20-third-party/08-tcollector.md +++ b/docs/en/20-third-party/08-tcollector.md @@ -44,26 +44,26 @@ taos> use tcollector; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - proc.meminfo.hugepages_rsvd | 2022-04-20 12:44:53.945 | 2 | 1 | 1 | - proc.meminfo.directmap1g | 2022-04-20 12:44:54.110 | 2 | 1 | 1 | - proc.meminfo.vmallocchunk | 2022-04-20 12:44:53.724 | 2 | 1 | 1 | - proc.meminfo.hugepagesize | 2022-04-20 12:44:54.004 | 2 | 1 | 1 | - tcollector.reader.lines_dro... | 2022-04-20 12:44:49.675 | 2 | 1 | 1 | - proc.meminfo.sunreclaim | 2022-04-20 12:44:53.437 | 2 | 1 | 1 | - proc.stat.ctxt | 2022-04-20 12:44:55.363 | 2 | 1 | 1 | - proc.meminfo.swaptotal | 2022-04-20 12:44:53.158 | 2 | 1 | 1 | - proc.uptime.total | 2022-04-20 12:44:52.813 | 2 | 1 | 1 | - tcollector.collector.lines_... | 2022-04-20 12:44:49.895 | 2 | 2 | 51 | - proc.meminfo.vmallocused | 2022-04-20 12:44:53.704 | 2 | 1 | 1 | - proc.meminfo.memavailable | 2022-04-20 12:44:52.939 | 2 | 1 | 1 | - sys.numa.foreign_allocs | 2022-04-20 12:44:57.929 | 2 | 2 | 1 | - proc.meminfo.committed_as | 2022-04-20 12:44:53.639 | 2 | 1 | 1 | - proc.vmstat.pswpin | 2022-04-20 12:44:54.177 | 2 | 1 | 1 | - proc.meminfo.cmafree | 2022-04-20 12:44:53.865 | 2 | 1 | 1 | - proc.meminfo.mapped | 2022-04-20 12:44:53.349 | 2 | 1 | 1 | - proc.vmstat.pgmajfault | 2022-04-20 12:44:54.251 | 2 | 1 | 1 | + name | +================================= + proc.meminfo.hugepages_rsvd | + proc.meminfo.directmap1g | + proc.meminfo.vmallocchunk | + proc.meminfo.hugepagesize | + tcollector.reader.lines_dro... | + proc.meminfo.sunreclaim | + proc.stat.ctxt | + proc.meminfo.swaptotal | + proc.uptime.total | + tcollector.collector.lines_... | + proc.meminfo.vmallocused | + proc.meminfo.memavailable | + sys.numa.foreign_allocs | + proc.meminfo.committed_as | + proc.vmstat.pswpin | + proc.meminfo.cmafree | + proc.meminfo.mapped | + proc.vmstat.pgmajfault | ... ``` diff --git a/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx b/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx index 58bca7f843..8d097e3f65 100644 --- a/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx +++ b/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx @@ -66,10 +66,10 @@ taos> use test; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - meters.current | 2022-03-30 17:04:10.877 | 2 | 2 | 2 | - meters.voltage | 2022-03-30 17:04:10.882 | 2 | 2 | 2 | + name | +================================= + meters.current | + meters.voltage | Query OK, 2 row(s) in set (0.002544s) taos> select tbname, * from `meters.current`; diff --git a/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx b/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx index aa3e5980cf..e2e7d7c8fa 100644 --- a/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx +++ b/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx @@ -82,10 +82,10 @@ taos> use test; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - meters.current | 2022-03-29 16:05:25.193 | 2 | 2 | 1 | - meters.voltage | 2022-03-29 16:05:25.200 | 2 | 2 | 1 | + name | +================================= + meters.current | + meters.voltage | Query OK, 2 row(s) in set (0.001954s) taos> select * from `meters.current`; diff --git a/docs/zh/08-connector/_verify_linux.mdx b/docs/zh/08-connector/_verify_linux.mdx index 28957e77aa..4137b2880b 100644 --- a/docs/zh/08-connector/_verify_linux.mdx +++ b/docs/zh/08-connector/_verify_linux.mdx @@ -4,11 +4,11 @@ $ taos taos> show databases; - name | create_time | vgroups | ntables | replica | strict | duration | keep | buffer | pagesize | pages | minrows | maxrows | comp | precision | status | retention | single_stable | cachemodel | cachesize | wal_level | wal_fsync_period | wal_retention_period | wal_retention_size | wal_roll_period | wal_seg_size | -========================================================================================================================================================================================================================================================================================================================================================================================================================================================================= - information_schema | NULL | NULL | 14 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | ready | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | - performance_schema | NULL | NULL | 3 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | ready | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | - db | 2022-08-04 14:14:49.385 | 2 | 4 | 1 | off | 14400m | 5254560m,5254560m,5254560m | 96 | 4 | 256 | 100 | 4096 | 2 | ms | ready | NULL | false | none | 1 | 1 | 3000 | 0 | 0 | 0 | 0 | + name | +================================= + information_schema | + performance_schema | + db | Query OK, 3 rows in database (0.019154s) taos> diff --git a/docs/zh/14-reference/_statsd.mdx b/docs/zh/14-reference/_statsd.mdx index b225c44267..dc4f19b37c 100644 --- a/docs/zh/14-reference/_statsd.mdx +++ b/docs/zh/14-reference/_statsd.mdx @@ -51,5 +51,6 @@ port: 8125 增加如下内容后启动 StatsD(假设配置文件修改为 config.js)。 ``` +npm install node stats.js config.js & ``` diff --git a/docs/zh/20-third-party/02-prometheus.md b/docs/zh/20-third-party/02-prometheus.md index 8b8d078792..0f95053a78 100644 --- a/docs/zh/20-third-party/02-prometheus.md +++ b/docs/zh/20-third-party/02-prometheus.md @@ -40,9 +40,9 @@ taos> use prometheus_data; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - metrics | 2022-04-20 07:21:09.209 | 2 | 1 | 1389 | + name | +================================= + metrics | Query OK, 1 row(s) in set (0.000487s) taos> select * from metrics limit 10; diff --git a/docs/zh/20-third-party/03-telegraf.md b/docs/zh/20-third-party/03-telegraf.md index 71bb1b3885..bb688a6ab6 100644 --- a/docs/zh/20-third-party/03-telegraf.md +++ b/docs/zh/20-third-party/03-telegraf.md @@ -44,16 +44,16 @@ taos> use telegraf; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - swap | 2022-04-20 08:47:53.532 | 7 | 1 | 1 | - cpu | 2022-04-20 08:48:03.488 | 11 | 2 | 5 | - system | 2022-04-20 08:47:53.512 | 8 | 1 | 1 | - diskio | 2022-04-20 08:47:53.550 | 12 | 2 | 15 | - kernel | 2022-04-20 08:47:53.503 | 6 | 1 | 1 | - mem | 2022-04-20 08:47:53.521 | 35 | 1 | 1 | - processes | 2022-04-20 08:47:53.555 | 12 | 1 | 1 | - disk | 2022-04-20 08:47:53.541 | 8 | 5 | 2 | + name | +================================= + swap | + cpu | + system | + diskio | + kernel | + mem | + processes | + disk | Query OK, 8 row(s) in set (0.000521s) taos> select * from telegraf.system limit 10; diff --git a/docs/zh/20-third-party/05-collectd.md b/docs/zh/20-third-party/05-collectd.md index d55b981fb9..bda66b3cce 100644 --- a/docs/zh/20-third-party/05-collectd.md +++ b/docs/zh/20-third-party/05-collectd.md @@ -32,28 +32,29 @@ sudo systemctl restart collectd ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - collectd | 2022-04-20 09:27:45.460 | 95 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | - log | 2022-04-20 07:19:50.260 | 11 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | -Query OK, 2 row(s) in set (0.003266s) + name | +================================= + information_schema | + performance_schema | + collectd | +Query OK, 3 row(s) in set (0.003266s) taos> use collectd; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - load_1 | 2022-04-20 09:27:45.492 | 2 | 2 | 1 | - memory_value | 2022-04-20 09:27:45.463 | 2 | 3 | 6 | - df_value | 2022-04-20 09:27:45.463 | 2 | 4 | 25 | - load_2 | 2022-04-20 09:27:45.501 | 2 | 2 | 1 | - load_0 | 2022-04-20 09:27:45.485 | 2 | 2 | 1 | - interface_1 | 2022-04-20 09:27:45.488 | 2 | 3 | 12 | - irq_value | 2022-04-20 09:27:45.476 | 2 | 3 | 31 | - interface_0 | 2022-04-20 09:27:45.480 | 2 | 3 | 12 | - entropy_value | 2022-04-20 09:27:45.473 | 2 | 2 | 1 | - swap_value | 2022-04-20 09:27:45.477 | 2 | 3 | 5 | + name | +================================= + load_1 | + memory_value | + df_value | + load_2 | + load_0 | + interface_1 | + irq_value | + interface_0 | + entropy_value | + swap_value | Query OK, 10 row(s) in set (0.002236s) taos> select * from collectd.memory_value limit 10; diff --git a/docs/zh/20-third-party/06-statsd.md b/docs/zh/20-third-party/06-statsd.md index 122c9fd94c..20b4d800be 100644 --- a/docs/zh/20-third-party/06-statsd.md +++ b/docs/zh/20-third-party/06-statsd.md @@ -27,7 +27,7 @@ StatsD 是汇总和总结应用指标的一个简单的守护进程,近些年 ``` $ node stats.js config.js & [1] 8546 -$ 20 Apr 09:54:41 - [8546] reading config file: exampleConfig.js +$ 20 Apr 09:54:41 - [8546] reading config file: config.js 20 Apr 09:54:41 - server is up INFO ``` @@ -41,19 +41,20 @@ $ echo "foo:1|c" | nc -u -w0 127.0.0.1 8125 ``` taos> show databases; - name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | -==================================================================================================================================================================================================================================================================================== - log | 2022-04-20 07:19:50.260 | 11 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | - statsd | 2022-04-20 09:54:51.220 | 1 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | -Query OK, 2 row(s) in set (0.003142s) + name | +================================= + information_schema | + performance_schema | + statsd | +Query OK, 3 row(s) in set (0.003142s) taos> use statsd; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - foo | 2022-04-20 09:54:51.234 | 2 | 1 | 1 | + name | +================================= + foo | Query OK, 1 row(s) in set (0.002161s) taos> select * from foo; @@ -64,3 +65,8 @@ Query OK, 1 row(s) in set (0.004179s) taos> ``` + +:::note + +- TDengine will automatically create unique IDs for sub-table names by the rule. +::: diff --git a/docs/zh/20-third-party/07-icinga2.md b/docs/zh/20-third-party/07-icinga2.md index 03d733a326..d112a7a5e6 100644 --- a/docs/zh/20-third-party/07-icinga2.md +++ b/docs/zh/20-third-party/07-icinga2.md @@ -48,30 +48,30 @@ taos> use icinga2; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - icinga.service.users.state_... | 2022-04-20 12:11:39.726 | 2 | 1 | 1 | - icinga.service.users.acknow... | 2022-04-20 12:11:39.756 | 2 | 1 | 1 | - icinga.service.procs.downti... | 2022-04-20 12:11:44.541 | 2 | 1 | 1 | - icinga.service.users.users | 2022-04-20 12:11:39.770 | 2 | 1 | 1 | - icinga.service.procs.procs_min | 2022-04-20 12:11:44.599 | 2 | 1 | 1 | - icinga.service.users.users_min | 2022-04-20 12:11:39.809 | 2 | 1 | 1 | - icinga.check.max_check_atte... | 2022-04-20 12:11:39.847 | 2 | 3 | 2 | - icinga.service.procs.state_... | 2022-04-20 12:11:44.522 | 2 | 1 | 1 | - icinga.service.procs.procs_... | 2022-04-20 12:11:44.576 | 2 | 1 | 1 | - icinga.service.users.users_... | 2022-04-20 12:11:39.796 | 2 | 1 | 1 | - icinga.check.latency | 2022-04-20 12:11:39.869 | 2 | 3 | 2 | - icinga.service.procs.procs_... | 2022-04-20 12:11:44.588 | 2 | 1 | 1 | - icinga.service.users.downti... | 2022-04-20 12:11:39.746 | 2 | 1 | 1 | - icinga.service.users.users_... | 2022-04-20 12:11:39.783 | 2 | 1 | 1 | - icinga.service.users.reachable | 2022-04-20 12:11:39.736 | 2 | 1 | 1 | - icinga.service.procs.procs | 2022-04-20 12:11:44.565 | 2 | 1 | 1 | - icinga.service.procs.acknow... | 2022-04-20 12:11:44.554 | 2 | 1 | 1 | - icinga.service.procs.state | 2022-04-20 12:11:44.509 | 2 | 1 | 1 | - icinga.service.procs.reachable | 2022-04-20 12:11:44.532 | 2 | 1 | 1 | - icinga.check.current_attempt | 2022-04-20 12:11:39.825 | 2 | 3 | 2 | - icinga.check.execution_time | 2022-04-20 12:11:39.898 | 2 | 3 | 2 | - icinga.service.users.state | 2022-04-20 12:11:39.704 | 2 | 1 | 1 | + name | +================================= + icinga.service.users.state_... | + icinga.service.users.acknow... | + icinga.service.procs.downti... | + icinga.service.users.users | + icinga.service.procs.procs_min | + icinga.service.users.users_min | + icinga.check.max_check_atte... | + icinga.service.procs.state_... | + icinga.service.procs.procs_... | + icinga.service.users.users_... | + icinga.check.latency | + icinga.service.procs.procs_... | + icinga.service.users.downti... | + icinga.service.users.users_... | + icinga.service.users.reachable | + icinga.service.procs.procs | + icinga.service.procs.acknow... | + icinga.service.procs.state | + icinga.service.procs.reachable | + icinga.check.current_attempt | + icinga.check.execution_time | + icinga.service.users.state | Query OK, 22 row(s) in set (0.002317s) ``` diff --git a/docs/zh/20-third-party/08-tcollector.md b/docs/zh/20-third-party/08-tcollector.md index b79e3ed2d1..a6ed0f89e2 100644 --- a/docs/zh/20-third-party/08-tcollector.md +++ b/docs/zh/20-third-party/08-tcollector.md @@ -46,26 +46,26 @@ taos> use tcollector; Database changed. taos> show stables; - name | created_time | columns | tags | tables | -============================================================================================ - proc.meminfo.hugepages_rsvd | 2022-04-20 12:44:53.945 | 2 | 1 | 1 | - proc.meminfo.directmap1g | 2022-04-20 12:44:54.110 | 2 | 1 | 1 | - proc.meminfo.vmallocchunk | 2022-04-20 12:44:53.724 | 2 | 1 | 1 | - proc.meminfo.hugepagesize | 2022-04-20 12:44:54.004 | 2 | 1 | 1 | - tcollector.reader.lines_dro... | 2022-04-20 12:44:49.675 | 2 | 1 | 1 | - proc.meminfo.sunreclaim | 2022-04-20 12:44:53.437 | 2 | 1 | 1 | - proc.stat.ctxt | 2022-04-20 12:44:55.363 | 2 | 1 | 1 | - proc.meminfo.swaptotal | 2022-04-20 12:44:53.158 | 2 | 1 | 1 | - proc.uptime.total | 2022-04-20 12:44:52.813 | 2 | 1 | 1 | - tcollector.collector.lines_... | 2022-04-20 12:44:49.895 | 2 | 2 | 51 | - proc.meminfo.vmallocused | 2022-04-20 12:44:53.704 | 2 | 1 | 1 | - proc.meminfo.memavailable | 2022-04-20 12:44:52.939 | 2 | 1 | 1 | - sys.numa.foreign_allocs | 2022-04-20 12:44:57.929 | 2 | 2 | 1 | - proc.meminfo.committed_as | 2022-04-20 12:44:53.639 | 2 | 1 | 1 | - proc.vmstat.pswpin | 2022-04-20 12:44:54.177 | 2 | 1 | 1 | - proc.meminfo.cmafree | 2022-04-20 12:44:53.865 | 2 | 1 | 1 | - proc.meminfo.mapped | 2022-04-20 12:44:53.349 | 2 | 1 | 1 | - proc.vmstat.pgmajfault | 2022-04-20 12:44:54.251 | 2 | 1 | 1 | + name | +================================= + proc.meminfo.hugepages_rsvd | + proc.meminfo.directmap1g | + proc.meminfo.vmallocchunk | + proc.meminfo.hugepagesize | + tcollector.reader.lines_dro... | + proc.meminfo.sunreclaim | + proc.stat.ctxt | + proc.meminfo.swaptotal | + proc.uptime.total | + tcollector.collector.lines_... | + proc.meminfo.vmallocused | + proc.meminfo.memavailable | + sys.numa.foreign_allocs | + proc.meminfo.committed_as | + proc.vmstat.pswpin | + proc.meminfo.cmafree | + proc.meminfo.mapped | + proc.vmstat.pgmajfault | ... ``` From c9286fed25225b40e9b2184f3c080d5900c376e5 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 30 Sep 2022 13:03:25 +0800 Subject: [PATCH 109/143] fix(query): fix memory leak. --- source/dnode/vnode/inc/vnode.h | 2 +- source/dnode/vnode/src/tsdb/tsdbCacheRead.c | 4 ++-- source/libs/executor/src/cachescanoperator.c | 11 ++++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 6ba10641f5..3e086de097 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -153,7 +153,7 @@ uint64_t getReaderMaxVersion(STsdbReader *pReader); int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, SArray *pTableIdList, int32_t numOfCols, void **pReader); int32_t tsdbRetrieveCacheRows(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, SArray *pTableUids); -int32_t tsdbCacherowsReaderClose(void *pReader); +void* tsdbCacherowsReaderClose(void *pReader); int32_t tsdbGetTableSchema(SVnode *pVnode, int64_t uid, STSchema **pSchema, int64_t *suid); void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity); diff --git a/source/dnode/vnode/src/tsdb/tsdbCacheRead.c b/source/dnode/vnode/src/tsdb/tsdbCacheRead.c index 5f981649f3..7a000253d5 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCacheRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbCacheRead.c @@ -101,7 +101,7 @@ int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, SArray* pTableIdList return TSDB_CODE_SUCCESS; } -int32_t tsdbCacherowsReaderClose(void* pReader) { +void* tsdbCacherowsReaderClose(void* pReader) { SCacheRowsReader* p = pReader; if (p->pSchema != NULL) { @@ -114,7 +114,7 @@ int32_t tsdbCacherowsReaderClose(void* pReader) { } taosMemoryFree(pReader); - return TSDB_CODE_SUCCESS; + return NULL; } static int32_t doExtractCacheRow(SCacheRowsReader* pr, SLRUCache* lruCache, uint64_t uid, STSRow** pRow, diff --git a/source/libs/executor/src/cachescanoperator.c b/source/libs/executor/src/cachescanoperator.c index 94d9d0cadb..1b7448712e 100644 --- a/source/libs/executor/src/cachescanoperator.c +++ b/source/libs/executor/src/cachescanoperator.c @@ -207,7 +207,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) { } } - tsdbCacherowsReaderClose(pInfo->pLastrowReader); + pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader); return pInfo->pRes; } } @@ -220,6 +220,15 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) { void destroyLastrowScanOperator(void* param) { SLastrowScanInfo* pInfo = (SLastrowScanInfo*)param; blockDataDestroy(pInfo->pRes); + blockDataDestroy(pInfo->pBufferredRes); + taosMemoryFree(pInfo->pSlotIds); + taosArrayDestroy(pInfo->pUidList); + taosArrayDestroy(pInfo->pColMatchInfo); + + if (pInfo->pLastrowReader != NULL) { + pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader); + } + taosMemoryFreeClear(param); } From dfb2b0678f2faae8a717aa3df183fdb68f77bc50 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 30 Sep 2022 14:03:46 +0800 Subject: [PATCH 110/143] fix: coverity issues --- source/dnode/mnode/impl/src/mndDef.c | 20 +++++++++++-- source/dnode/mnode/impl/src/mndStb.c | 22 +++++++-------- source/dnode/mnode/impl/src/mndStream.c | 37 ++++++++++++------------- source/dnode/vnode/src/vnd/vnodeSync.c | 12 ++++---- 4 files changed, 51 insertions(+), 40 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndDef.c b/source/dnode/mnode/impl/src/mndDef.c index 50d26ce9a5..42e56cd488 100644 --- a/source/dnode/mnode/impl/src/mndDef.c +++ b/source/dnode/mnode/impl/src/mndDef.c @@ -42,9 +42,23 @@ int32_t tEncodeSStreamObj(SEncoder *pEncoder, const SStreamObj *pObj) { if (tEncodeI64(pEncoder, pObj->targetStbUid) < 0) return -1; if (tEncodeI32(pEncoder, pObj->fixedSinkVgId) < 0) return -1; - if (tEncodeCStr(pEncoder, pObj->sql) < 0) return -1; - if (tEncodeCStr(pEncoder, pObj->ast) < 0) return -1; - if (tEncodeCStr(pEncoder, pObj->physicalPlan) < 0) return -1; + if (pObj->sql != NULL) { + if (tEncodeCStr(pEncoder, pObj->sql) < 0) return -1; + } else { + if (tEncodeCStr(pEncoder, "") < 0) return -1; + } + + if (pObj->ast != NULL) { + if (tEncodeCStr(pEncoder, pObj->ast) < 0) return -1; + } else { + if (tEncodeCStr(pEncoder, "") < 0) return -1; + } + + if (pObj->physicalPlan != NULL) { + if (tEncodeCStr(pEncoder, pObj->physicalPlan) < 0) return -1; + } else { + if (tEncodeCStr(pEncoder, "") < 0) return -1; + } int32_t sz = taosArrayGetSize(pObj->tasks); if (tEncodeI32(pEncoder, sz) < 0) return -1; diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c index 38c7850e6c..8cd8431c34 100644 --- a/source/dnode/mnode/impl/src/mndStb.c +++ b/source/dnode/mnode/impl/src/mndStb.c @@ -554,7 +554,7 @@ int32_t mndCheckCreateStbReq(SMCreateStbReq *pCreate) { for (int32_t i = 0; i < pCreate->numOfColumns; ++i) { SField *pField1 = taosArrayGet(pCreate->pColumns, i); - if (pField1->type < 0) { + if (pField1->type >= TSDB_DATA_TYPE_MAX) { terrno = TSDB_CODE_MND_INVALID_STB_OPTION; return -1; } @@ -570,7 +570,7 @@ int32_t mndCheckCreateStbReq(SMCreateStbReq *pCreate) { for (int32_t i = 0; i < pCreate->numOfTags; ++i) { SField *pField1 = taosArrayGet(pCreate->pTags, i); - if (pField1->type < 0) { + if (pField1->type >= TSDB_DATA_TYPE_MAX) { terrno = TSDB_CODE_MND_INVALID_STB_OPTION; return -1; } @@ -982,8 +982,8 @@ static int32_t mndProcessCreateStbReq(SRpcMsg *pReq) { goto _OVER; } } else { - mError("stb:%s, already exist while create, input tagVer:%d colVer:%d is invalid", createReq.name, - createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer); + mError("stb:%s, already exist while create, input tagVer:%d colVer:%d is invalid, origin tagVer:%d colVer:%d", + createReq.name, createReq.tagVer, createReq.colVer, pStb->tagVer, pStb->colVer); terrno = TSDB_CODE_MND_INVALID_SCHEMA_VER; goto _OVER; } @@ -1603,9 +1603,9 @@ static int32_t mndBuildStbSchemaImp(SDbObj *pDb, SStbObj *pStb, const char *tbNa return -1; } - strcpy(pRsp->dbFName, pStb->db); - strcpy(pRsp->tbName, tbName); - strcpy(pRsp->stbName, tbName); + tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName)); + tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName)); + tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName)); pRsp->dbId = pDb->uid; pRsp->numOfTags = pStb->numOfTags; pRsp->numOfColumns = pStb->numOfColumns; @@ -1649,9 +1649,9 @@ static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, return -1; } - strcpy(pRsp->dbFName, pStb->db); - strcpy(pRsp->tbName, tbName); - strcpy(pRsp->stbName, tbName); + tstrncpy(pRsp->dbFName, pStb->db, sizeof(pRsp->dbFName)); + tstrncpy(pRsp->tbName, tbName, sizeof(pRsp->tbName)); + tstrncpy(pRsp->stbName, tbName, sizeof(pRsp->stbName)); pRsp->numOfTags = pStb->numOfTags; pRsp->numOfColumns = pStb->numOfColumns; pRsp->tableType = TSDB_SUPER_TABLE; @@ -2551,7 +2551,7 @@ static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)maxDelay, false); - char rollup[128 + VARSTR_HEADER_SIZE] = {0}; + char rollup[160 + VARSTR_HEADER_SIZE] = {0}; int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs); for (int32_t i = 0; i < rollupNum; ++i) { char *funcName = taosArrayGet(pStb->pFuncs, i); diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index c6f46b28fc..03d7d8e825 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -425,8 +425,10 @@ static int32_t mndSetStreamRecover(SMnode *pMnode, STrans *pTrans, const SStream SStreamObj streamObj = {0}; memcpy(streamObj.name, pStream->name, TSDB_STREAM_FNAME_LEN); streamObj.status = STREAM_STATUS__RECOVER; + SSdbRaw *pCommitRaw = mndStreamActionEncode(&streamObj); - if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) { + if (pCommitRaw == NULL) return -1; + if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) { mError("stream trans:%d, failed to append commit log since %s", pTrans->id, terrstr()); mndTransDrop(pTrans); return -1; @@ -771,12 +773,14 @@ static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) { if (mndDropStreamTasks(pMnode, pTrans, pStream) < 0) { mError("stream:%s, failed to drop task since %s", dropReq.name, terrstr()); sdbRelease(pMnode->pSdb, pStream); + mndTransDrop(pTrans); return -1; } // drop stream if (mndPersistDropStreamLog(pMnode, pTrans, pStream) < 0) { sdbRelease(pMnode->pSdb, pStream); + mndTransDrop(pTrans); return -1; } @@ -945,10 +949,8 @@ static int32_t mndRetrieveStream(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB SName n; int32_t cols = 0; - char streamName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - tNameFromString(&n, pStream->name, T_NAME_ACCT | T_NAME_DB); - tNameGetDbName(&n, varDataVal(streamName)); - varDataSetLen(streamName, strlen(varDataVal(streamName))); + char streamName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_WITH_MAXSIZE_TO_VARSTR(streamName, mndGetDbStr(pStream->name), sizeof(streamName)); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)streamName, false); @@ -956,28 +958,24 @@ static int32_t mndRetrieveStream(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB colDataAppend(pColInfo, numOfRows, (const char *)&pStream->createTime, false); char sql[TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE] = {0}; - tstrncpy(&sql[VARSTR_HEADER_SIZE], pStream->sql, TSDB_SHOW_SQL_LEN); - varDataSetLen(sql, strlen(&sql[VARSTR_HEADER_SIZE])); + STR_WITH_MAXSIZE_TO_VARSTR(streamName, pStream->sql, sizeof(sql)); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)sql, false); char status[20 + VARSTR_HEADER_SIZE] = {0}; - mndShowStreamStatus(&status[VARSTR_HEADER_SIZE], pStream); - varDataSetLen(status, strlen(varDataVal(status))); + char status2[20] = {0}; + mndShowStreamStatus(status2, pStream); + STR_WITH_MAXSIZE_TO_VARSTR(status, status2, sizeof(status)); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)&status, false); char sourceDB[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - tNameFromString(&n, pStream->sourceDb, T_NAME_ACCT | T_NAME_DB); - tNameGetDbName(&n, varDataVal(sourceDB)); - varDataSetLen(sourceDB, strlen(varDataVal(sourceDB))); + STR_WITH_MAXSIZE_TO_VARSTR(sourceDB, mndGetDbStr(pStream->sourceDb), sizeof(sourceDB)); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)&sourceDB, false); char targetDB[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - tNameFromString(&n, pStream->targetDb, T_NAME_ACCT | T_NAME_DB); - tNameGetDbName(&n, varDataVal(targetDB)); - varDataSetLen(targetDB, strlen(varDataVal(targetDB))); + STR_WITH_MAXSIZE_TO_VARSTR(targetDB, mndGetDbStr(pStream->targetDb), sizeof(targetDB)); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)&targetDB, false); @@ -986,9 +984,7 @@ static int32_t mndRetrieveStream(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB colDataAppend(pColInfo, numOfRows, NULL, true); } else { char targetSTB[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - tNameFromString(&n, pStream->targetSTbName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); - strcpy(&targetSTB[VARSTR_HEADER_SIZE], tNameGetTableName(&n)); - varDataSetLen(targetSTB, strlen(varDataVal(targetSTB))); + STR_WITH_MAXSIZE_TO_VARSTR(targetSTB, mndGetStbStr(pStream->targetSTbName), sizeof(targetSTB)); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)&targetSTB, false); } @@ -997,8 +993,9 @@ static int32_t mndRetrieveStream(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB colDataAppend(pColInfo, numOfRows, (const char *)&pStream->watermark, false); char trigger[20 + VARSTR_HEADER_SIZE] = {0}; - mndShowStreamTrigger(&trigger[VARSTR_HEADER_SIZE], pStream); - varDataSetLen(trigger, strlen(varDataVal(trigger))); + char trigger2[20] = {0}; + mndShowStreamTrigger(trigger2, pStream); + STR_WITH_MAXSIZE_TO_VARSTR(trigger, trigger2, sizeof(trigger)); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)&trigger, false); diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c index aa3f72d281..f773de5280 100644 --- a/source/dnode/vnode/src/vnd/vnodeSync.c +++ b/source/dnode/vnode/src/vnd/vnodeSync.c @@ -328,14 +328,14 @@ int32_t vnodeProcessSyncMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) { const STraceId *trace = &pMsg->info.traceId; if (!syncEnvIsStart()) { - vGError("vgId:%d, msg:%p failed to process since sync env not start", pVnode->config.vgId); + vGError("vgId:%d, msg:%p failed to process since sync env not start", pVnode->config.vgId, pMsg); terrno = TSDB_CODE_APP_ERROR; return -1; } SSyncNode *pSyncNode = syncNodeAcquire(pVnode->sync); if (pSyncNode == NULL) { - vGError("vgId:%d, msg:%p failed to process since invalid sync node", pVnode->config.vgId); + vGError("vgId:%d, msg:%p failed to process since invalid sync node", pVnode->config.vgId, pMsg); terrno = TSDB_CODE_SYN_INTERNAL_ERROR; return -1; } @@ -394,7 +394,7 @@ int32_t vnodeProcessSyncMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) { SRpcMsg rsp = {.code = code, .info = pMsg->info}; tmsgSendRsp(&rsp); } else { - vGError("vgId:%d, msg:%p failed to process since error msg type:%d", pVnode->config.vgId, pMsg->msgType); + vGError("vgId:%d, msg:%p failed to process since error msg type:%d", pVnode->config.vgId, pMsg, pMsg->msgType); code = -1; } @@ -459,7 +459,7 @@ int32_t vnodeProcessSyncMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) { SRpcMsg rsp = {.code = code, .info = pMsg->info}; tmsgSendRsp(&rsp); } else { - vGError("vgId:%d, msg:%p failed to process since error msg type:%d", pVnode->config.vgId, pMsg->msgType); + vGError("vgId:%d, msg:%p failed to process since error msg type:%d", pVnode->config.vgId, pMsg, pMsg->msgType); code = -1; } } @@ -630,7 +630,7 @@ static int32_t vnodeSnapshotStartWrite(struct SSyncFSM *pFsm, void *pParam, void vInfo("vgId:%d, start write vnode snapshot since apply queue is empty", pVnode->config.vgId); break; } else { - vInfo("vgId:%d, write vnode snapshot later since %d items in apply queue", pVnode->config.vgId); + vInfo("vgId:%d, write vnode snapshot later since %d items in apply queue", pVnode->config.vgId, itemSize); taosMsleep(10); } } while (true); @@ -683,7 +683,7 @@ static void vnodeRestoreFinish(struct SSyncFSM *pFsm) { vInfo("vgId:%d, apply queue is empty, restore finish", pVnode->config.vgId); break; } else { - vInfo("vgId:%d, restore not finish since %d items in apply queue", pVnode->config.vgId); + vInfo("vgId:%d, restore not finish since %d items in apply queue", pVnode->config.vgId, itemSize); taosMsleep(10); } } while (true); From 50b478bd59987cb39fcad23ed5b5505fd460b855 Mon Sep 17 00:00:00 2001 From: WANG MINGMING Date: Fri, 30 Sep 2022 14:17:14 +0800 Subject: [PATCH 111/143] Update 02-influxdb-line.mdx --- docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx b/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx index a107ffb1b6..1828f3317a 100644 --- a/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx +++ b/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx @@ -67,6 +67,9 @@ meters,location=California.LosAngeles,groupid=2 current=13.4,voltage=223,phase=0 -## 查询示例 -比如查询 location=California.LosAngeles,groupid=2 子表的数据可以通过如下sql: +## SQL查询示例 +- meters 是插入数据的超级表名 +- 可以通过超级表的tag来过滤数据,比如查询 `location=California.LosAngeles,groupid=2` 可以通过如下sql: +``` sql select * from meters where location=California.LosAngeles and groupid=2 +``` From a090fbfc0b66553d5afd9bde3b9b088d14019cbe Mon Sep 17 00:00:00 2001 From: WANG MINGMING Date: Fri, 30 Sep 2022 14:25:49 +0800 Subject: [PATCH 112/143] Update 02-influxdb-line.mdx --- docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx b/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx index a107ffb1b6..1cf5a33c17 100644 --- a/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx +++ b/docs/zh/07-develop/03-insert-data/02-influxdb-line.mdx @@ -67,6 +67,9 @@ meters,location=California.LosAngeles,groupid=2 current=13.4,voltage=223,phase=0 -## 查询示例 -比如查询 location=California.LosAngeles,groupid=2 子表的数据可以通过如下sql: -select * from meters where location=California.LosAngeles and groupid=2 +## SQL查询示例 +- meters 是插入数据的超级表名 +- 可以通过超级表的tag来过滤数据,比如查询 `location=California.LosAngeles,groupid=2` 可以通过如下sql: +``` cmd +select * from meters where location="California.LosAngeles" and groupid=2 +``` From 471f23fd58db1f7e2c3c02c8c1fe3cc866bdac0c Mon Sep 17 00:00:00 2001 From: WANG MINGMING Date: Fri, 30 Sep 2022 14:26:54 +0800 Subject: [PATCH 113/143] Update 03-opentsdb-telnet.mdx --- .../07-develop/03-insert-data/03-opentsdb-telnet.mdx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx b/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx index 8d097e3f65..b008953c0b 100644 --- a/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx +++ b/docs/zh/07-develop/03-insert-data/03-opentsdb-telnet.mdx @@ -81,6 +81,10 @@ taos> select tbname, * from `meters.current`; t_7e7b26dd860280242c6492a16... | 2022-03-28 09:56:51.250 | 12.600000000 | 2 | California.SanFrancisco | Query OK, 4 row(s) in set (0.005399s) ``` -## 查询示例: -想要查询 location=California.LosAngeles groupid=3 的数据,可以通过如下sql: -select * from `meters.voltage` where location="California.LosAngeles" and groupid=3 + +## SQL查询示例 +- `meters.current` 是插入数据的超级表名 +- 可以通过超级表的tag来过滤数据,比如查询 `location=California.LosAngeles groupid=3` 可以通过如下sql: +``` cmd +select * from `meters.current` where location="California.LosAngeles" and groupid=3 +``` From e7d9d99d31d83da8fc804030a59d17467f355ec5 Mon Sep 17 00:00:00 2001 From: WANG MINGMING Date: Fri, 30 Sep 2022 14:26:59 +0800 Subject: [PATCH 114/143] Update 04-opentsdb-json.mdx --- docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx b/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx index e2e7d7c8fa..1795d8edde 100644 --- a/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx +++ b/docs/zh/07-develop/03-insert-data/04-opentsdb-json.mdx @@ -96,6 +96,9 @@ taos> select * from `meters.current`; Query OK, 2 row(s) in set (0.004076s) ``` -## 查询示例 -想要查询"tags": {"location": "California.LosAngeles", "groupid": 1} 的数据,可以通过如下sql: +## SQL查询示例 +- `meters.voltage` 是插入数据的超级表名 +- 可以通过超级表的tag来过滤数据,比如查询 `location=California.LosAngeles groupid=1` 可以通过如下sql: +``` cmd select * from `meters.voltage` where location="California.LosAngeles" and groupid=1 +``` From 3ed27805c37d5bbb2ca15d6b44700289444d0204 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Fri, 30 Sep 2022 14:43:51 +0800 Subject: [PATCH 115/143] fix: query information_schema.ins_tags error --- source/libs/parser/inc/parUtil.h | 1 + source/libs/parser/src/parAstParser.c | 21 +++++ source/libs/parser/src/parTranslater.c | 110 +++++++++++----------- source/libs/parser/src/parUtil.c | 67 ++++++++++++- source/libs/parser/test/parSelectTest.cpp | 6 +- source/libs/parser/test/parTestMain.cpp | 2 +- source/libs/planner/test/planTestMain.cpp | 2 +- 7 files changed, 149 insertions(+), 60 deletions(-) diff --git a/source/libs/parser/inc/parUtil.h b/source/libs/parser/inc/parUtil.h index 308afd467f..75b631ec9d 100644 --- a/source/libs/parser/inc/parUtil.h +++ b/source/libs/parser/inc/parUtil.h @@ -91,6 +91,7 @@ STableComInfo getTableInfo(const STableMeta* pTableMeta); STableMeta* tableMetaDup(const STableMeta* pTableMeta); int32_t trimString(const char* src, int32_t len, char* dst, int32_t dlen); +int32_t getInsTagsTableTargetName(int32_t acctId, SNode* pWhere, SName* pName); int32_t buildCatalogReq(SParseContext* pCxt, const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq); int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache, diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c index ce90bd3da0..27adb79e3c 100644 --- a/source/libs/parser/src/parAstParser.c +++ b/source/libs/parser/src/parAstParser.c @@ -125,6 +125,23 @@ static bool needGetTableIndex(SNode* pStmt) { return false; } +static int32_t collectMetaKeyFromInsTagsImpl(SCollectMetaKeyCxt* pCxt, SName* pName) { + if (TSDB_DB_NAME_T == pName->type) { + return reserveDbVgInfoInCache(pName->acctId, pName->dbname, pCxt->pMetaCache); + } + return reserveTableVgroupInCacheExt(pName, pCxt->pMetaCache); +} + +static int32_t collectMetaKeyFromInsTags(SCollectMetaKeyCxt* pCxt) { + SSelectStmt* pSelect = (SSelectStmt*)pCxt->pStmt; + SName name = {0}; + int32_t code = getInsTagsTableTargetName(pCxt->pParseCxt->acctId, pSelect->pWhere, &name); + if (TSDB_CODE_SUCCESS == code) { + code = collectMetaKeyFromInsTagsImpl(pCxt, &name); + } + return code; +} + static int32_t collectMetaKeyFromRealTableImpl(SCollectMetaKeyCxt* pCxt, const char* pDb, const char* pTable, AUTH_TYPE authType) { int32_t code = reserveTableMetaInCache(pCxt->pParseCxt->acctId, pDb, pTable, pCxt->pMetaCache); @@ -143,6 +160,10 @@ static int32_t collectMetaKeyFromRealTableImpl(SCollectMetaKeyCxt* pCxt, const c if (TSDB_CODE_SUCCESS == code && (0 == strcmp(pTable, TSDB_INS_TABLE_DNODE_VARIABLES))) { code = reserveDnodeRequiredInCache(pCxt->pMetaCache); } + if (TSDB_CODE_SUCCESS == code && (0 == strcmp(pTable, TSDB_INS_TABLE_TAGS)) && + QUERY_NODE_SELECT_STMT == nodeType(pCxt->pStmt)) { + code = collectMetaKeyFromInsTags(pCxt); + } return code; } diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 9d805b8e33..b58626e6fb 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -2198,70 +2198,70 @@ static int32_t getTagsTableVgroupListImpl(STranslateContext* pCxt, SName* pTarge return code; } -static int32_t getTagsTableTargetNameFromOp(STranslateContext* pCxt, SOperatorNode* pOper, SName* pName) { - if (OP_TYPE_EQUAL != pOper->opType) { - return TSDB_CODE_SUCCESS; - } +// static int32_t getTagsTableTargetNameFromOp(STranslateContext* pCxt, SOperatorNode* pOper, SName* pName) { +// if (OP_TYPE_EQUAL != pOper->opType) { +// return TSDB_CODE_SUCCESS; +// } - SColumnNode* pCol = NULL; - SValueNode* pVal = NULL; - if (QUERY_NODE_COLUMN == nodeType(pOper->pLeft)) { - pCol = (SColumnNode*)pOper->pLeft; - } else if (QUERY_NODE_VALUE == nodeType(pOper->pLeft)) { - pVal = (SValueNode*)pOper->pLeft; - } - if (QUERY_NODE_COLUMN == nodeType(pOper->pRight)) { - pCol = (SColumnNode*)pOper->pRight; - } else if (QUERY_NODE_VALUE == nodeType(pOper->pRight)) { - pVal = (SValueNode*)pOper->pRight; - } - if (NULL == pCol || NULL == pVal) { - return TSDB_CODE_SUCCESS; - } +// SColumnNode* pCol = NULL; +// SValueNode* pVal = NULL; +// if (QUERY_NODE_COLUMN == nodeType(pOper->pLeft)) { +// pCol = (SColumnNode*)pOper->pLeft; +// } else if (QUERY_NODE_VALUE == nodeType(pOper->pLeft)) { +// pVal = (SValueNode*)pOper->pLeft; +// } +// if (QUERY_NODE_COLUMN == nodeType(pOper->pRight)) { +// pCol = (SColumnNode*)pOper->pRight; +// } else if (QUERY_NODE_VALUE == nodeType(pOper->pRight)) { +// pVal = (SValueNode*)pOper->pRight; +// } +// if (NULL == pCol || NULL == pVal) { +// return TSDB_CODE_SUCCESS; +// } - if (0 == strcmp(pCol->colName, "db_name")) { - return tNameSetDbName(pName, pCxt->pParseCxt->acctId, pVal->literal, strlen(pVal->literal)); - } else if (0 == strcmp(pCol->colName, "table_name")) { - return tNameAddTbName(pName, pVal->literal, strlen(pVal->literal)); - } +// if (0 == strcmp(pCol->colName, "db_name")) { +// return tNameSetDbName(pName, pCxt->pParseCxt->acctId, pVal->literal, strlen(pVal->literal)); +// } else if (0 == strcmp(pCol->colName, "table_name")) { +// return tNameAddTbName(pName, pVal->literal, strlen(pVal->literal)); +// } - return TSDB_CODE_SUCCESS; -} +// return TSDB_CODE_SUCCESS; +// } -static void getTagsTableTargetObjName(STranslateContext* pCxt, SNode* pNode, SName* pName) { - if (QUERY_NODE_OPERATOR == nodeType(pNode)) { - getTagsTableTargetNameFromOp(pCxt, (SOperatorNode*)pNode, pName); - } -} +// static void getTagsTableTargetObjName(STranslateContext* pCxt, SNode* pNode, SName* pName) { +// if (QUERY_NODE_OPERATOR == nodeType(pNode)) { +// getTagsTableTargetNameFromOp(pCxt, (SOperatorNode*)pNode, pName); +// } +// } -static int32_t getTagsTableTargetNameFromCond(STranslateContext* pCxt, SLogicConditionNode* pCond, SName* pName) { - if (LOGIC_COND_TYPE_AND != pCond->condType) { - return TSDB_CODE_SUCCESS; - } +// static int32_t getTagsTableTargetNameFromCond(STranslateContext* pCxt, SLogicConditionNode* pCond, SName* pName) { +// if (LOGIC_COND_TYPE_AND != pCond->condType) { +// return TSDB_CODE_SUCCESS; +// } - SNode* pNode = NULL; - FOREACH(pNode, pCond->pParameterList) { getTagsTableTargetObjName(pCxt, pNode, pName); } - if ('\0' == pName->dbname[0]) { - pName->type = 0; - } - return TSDB_CODE_SUCCESS; -} +// SNode* pNode = NULL; +// FOREACH(pNode, pCond->pParameterList) { getTagsTableTargetObjName(pCxt, pNode, pName); } +// if ('\0' == pName->dbname[0]) { +// pName->type = 0; +// } +// return TSDB_CODE_SUCCESS; +// } -static int32_t getTagsTableTargetName(STranslateContext* pCxt, SNode* pWhere, SName* pName) { - if (NULL == pWhere) { - return TSDB_CODE_SUCCESS; - } +// static int32_t getTagsTableTargetName(STranslateContext* pCxt, SNode* pWhere, SName* pName) { +// if (NULL == pWhere) { +// return TSDB_CODE_SUCCESS; +// } - if (QUERY_NODE_OPERATOR == nodeType(pWhere)) { - return getTagsTableTargetNameFromOp(pCxt, (SOperatorNode*)pWhere, pName); - } +// if (QUERY_NODE_OPERATOR == nodeType(pWhere)) { +// return getTagsTableTargetNameFromOp(pCxt, (SOperatorNode*)pWhere, pName); +// } - if (QUERY_NODE_LOGIC_CONDITION == nodeType(pWhere)) { - return getTagsTableTargetNameFromCond(pCxt, (SLogicConditionNode*)pWhere, pName); - } +// if (QUERY_NODE_LOGIC_CONDITION == nodeType(pWhere)) { +// return getTagsTableTargetNameFromCond(pCxt, (SLogicConditionNode*)pWhere, pName); +// } - return TSDB_CODE_SUCCESS; -} +// return TSDB_CODE_SUCCESS; +// } static int32_t getTagsTableVgroupList(STranslateContext* pCxt, SName* pName, SArray** pVgroupList) { if (!isSelectStmt(pCxt->pCurrStmt)) { @@ -2269,7 +2269,7 @@ static int32_t getTagsTableVgroupList(STranslateContext* pCxt, SName* pName, SAr } SSelectStmt* pSelect = (SSelectStmt*)pCxt->pCurrStmt; SName targetName = {0}; - int32_t code = getTagsTableTargetName(pCxt, pSelect->pWhere, &targetName); + int32_t code = getInsTagsTableTargetName(pCxt->pParseCxt->acctId, pSelect->pWhere, &targetName); if (TSDB_CODE_SUCCESS == code) { code = getTagsTableVgroupListImpl(pCxt, &targetName, pName, pVgroupList); } diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c index 3075be1a00..c6a51f22e8 100644 --- a/source/libs/parser/src/parUtil.c +++ b/source/libs/parser/src/parUtil.c @@ -420,6 +420,71 @@ end: return retCode; } +static int32_t getInsTagsTableTargetNameFromOp(int32_t acctId, SOperatorNode* pOper, SName* pName) { + if (OP_TYPE_EQUAL != pOper->opType) { + return TSDB_CODE_SUCCESS; + } + + SColumnNode* pCol = NULL; + SValueNode* pVal = NULL; + if (QUERY_NODE_COLUMN == nodeType(pOper->pLeft)) { + pCol = (SColumnNode*)pOper->pLeft; + } else if (QUERY_NODE_VALUE == nodeType(pOper->pLeft)) { + pVal = (SValueNode*)pOper->pLeft; + } + if (QUERY_NODE_COLUMN == nodeType(pOper->pRight)) { + pCol = (SColumnNode*)pOper->pRight; + } else if (QUERY_NODE_VALUE == nodeType(pOper->pRight)) { + pVal = (SValueNode*)pOper->pRight; + } + if (NULL == pCol || NULL == pVal) { + return TSDB_CODE_SUCCESS; + } + + if (0 == strcmp(pCol->colName, "db_name")) { + return tNameSetDbName(pName, acctId, pVal->literal, strlen(pVal->literal)); + } else if (0 == strcmp(pCol->colName, "table_name")) { + return tNameAddTbName(pName, pVal->literal, strlen(pVal->literal)); + } + + return TSDB_CODE_SUCCESS; +} + +static void getInsTagsTableTargetObjName(int32_t acctId, SNode* pNode, SName* pName) { + if (QUERY_NODE_OPERATOR == nodeType(pNode)) { + getInsTagsTableTargetNameFromOp(acctId, (SOperatorNode*)pNode, pName); + } +} + +static int32_t getInsTagsTableTargetNameFromCond(int32_t acctId, SLogicConditionNode* pCond, SName* pName) { + if (LOGIC_COND_TYPE_AND != pCond->condType) { + return TSDB_CODE_SUCCESS; + } + + SNode* pNode = NULL; + FOREACH(pNode, pCond->pParameterList) { getInsTagsTableTargetObjName(acctId, pNode, pName); } + if ('\0' == pName->dbname[0]) { + pName->type = 0; + } + return TSDB_CODE_SUCCESS; +} + +int32_t getInsTagsTableTargetName(int32_t acctId, SNode* pWhere, SName* pName) { + if (NULL == pWhere) { + return TSDB_CODE_SUCCESS; + } + + if (QUERY_NODE_OPERATOR == nodeType(pWhere)) { + return getInsTagsTableTargetNameFromOp(acctId, (SOperatorNode*)pWhere, pName); + } + + if (QUERY_NODE_LOGIC_CONDITION == nodeType(pWhere)) { + return getInsTagsTableTargetNameFromCond(acctId, (SLogicConditionNode*)pWhere, pName); + } + + return TSDB_CODE_SUCCESS; +} + static int32_t userAuthToString(int32_t acctId, const char* pUser, const char* pDb, AUTH_TYPE type, char* pStr) { return sprintf(pStr, "%s*%d.%s*%d", pUser, acctId, pDb, type); } @@ -1173,7 +1238,7 @@ void destoryParseMetaCache(SParseMetaCache* pMetaCache, bool request) { taosArrayDestroy(p->pTableVgroupReq); p = taosHashIterate(pMetaCache->pInsertTables, p); - } + } taosHashCleanup(pMetaCache->pInsertTables); taosHashCleanup(pMetaCache->pDbVgroup); taosHashCleanup(pMetaCache->pDbCfg); diff --git a/source/libs/parser/test/parSelectTest.cpp b/source/libs/parser/test/parSelectTest.cpp index 79a7038401..0027ac9ca1 100644 --- a/source/libs/parser/test/parSelectTest.cpp +++ b/source/libs/parser/test/parSelectTest.cpp @@ -420,9 +420,11 @@ TEST_F(ParserSelectTest, setOperatorSemanticCheck) { } TEST_F(ParserSelectTest, informationSchema) { - useDb("root", "test"); + useDb("root", "information_schema"); - run("SELECT * FROM information_schema.ins_databases WHERE name = 'information_schema'"); + run("SELECT * FROM ins_databases WHERE name = 'information_schema'"); + + run("SELECT * FROM ins_tags WHERE db_name = 'test' and table_name = 'st1'"); } TEST_F(ParserSelectTest, withoutFrom) { diff --git a/source/libs/parser/test/parTestMain.cpp b/source/libs/parser/test/parTestMain.cpp index 9e67249238..de2ce55459 100644 --- a/source/libs/parser/test/parTestMain.cpp +++ b/source/libs/parser/test/parTestMain.cpp @@ -53,7 +53,7 @@ class ParserEnv : public testing::Environment { private: void initLog(const char* path) { - int32_t logLevel = getLogLevel(); + int32_t logLevel = getLogLevel() | DEBUG_SCREEN; dDebugFlag = logLevel; vDebugFlag = logLevel; mDebugFlag = logLevel; diff --git a/source/libs/planner/test/planTestMain.cpp b/source/libs/planner/test/planTestMain.cpp index df6e72ce46..4e013c44b8 100644 --- a/source/libs/planner/test/planTestMain.cpp +++ b/source/libs/planner/test/planTestMain.cpp @@ -48,7 +48,7 @@ class PlannerEnv : public testing::Environment { private: void initLog(const char* path) { - int32_t logLevel = getLogLevel(); + int32_t logLevel = getLogLevel() | DEBUG_SCREEN; dDebugFlag = logLevel; vDebugFlag = logLevel; mDebugFlag = logLevel; From 6faf1af5f5f3c610b97827465bcaa1147380a480 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 30 Sep 2022 14:44:42 +0800 Subject: [PATCH 116/143] fix(query): handle the block read case. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index c3cb5f9eb8..de64b8a61e 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -926,6 +926,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn } } + // fill the mis-matched columns with null value while (i < numOfOutputCols) { pColData = taosArrayGet(pResBlock->pDataBlock, i); colDataAppendNNULL(pColData, 0, remain); @@ -935,12 +936,15 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn pResBlock->info.rows = remain; pDumpInfo->rowIndex += step * remain; + // check if current block are all handled if (pDumpInfo->rowIndex >= 0 && pDumpInfo->rowIndex < pBlock->nRow) { -// int64_t ts = pBlockData->aTSKEY[pDumpInfo->rowIndex]; -// setBlockAllDumped(pDumpInfo, ts, pReader->order); + int64_t ts = pBlockData->aTSKEY[pDumpInfo->rowIndex]; + if (outOfTimeWindow(ts, &pReader->window)) { // the remain data has out of query time window, ignore current block + setBlockAllDumped(pDumpInfo, ts, pReader->order); + } } else { - int64_t k = asc ? pBlock->maxKey.ts : pBlock->minKey.ts; - setBlockAllDumped(pDumpInfo, k, pReader->order); + int64_t ts = asc ? pBlock->maxKey.ts : pBlock->minKey.ts; + setBlockAllDumped(pDumpInfo, ts, pReader->order); } double elapsedTime = (taosGetTimestampUs() - st) / 1000.0; From 31e424d5aba662b2922fe3a53d2b5dd4ba3c8f2a Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Fri, 30 Sep 2022 14:59:31 +0800 Subject: [PATCH 117/143] fix: coverity issues --- source/dnode/mnode/impl/src/mndStream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index 03d7d8e825..ea889e7001 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -958,7 +958,7 @@ static int32_t mndRetrieveStream(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB colDataAppend(pColInfo, numOfRows, (const char *)&pStream->createTime, false); char sql[TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_WITH_MAXSIZE_TO_VARSTR(streamName, pStream->sql, sizeof(sql)); + STR_WITH_MAXSIZE_TO_VARSTR(sql, pStream->sql, sizeof(sql)); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); colDataAppend(pColInfo, numOfRows, (const char *)sql, false); From 99befe4a8915f9bc01328bcb0c0babf1547ba2d6 Mon Sep 17 00:00:00 2001 From: shenglian zhou Date: Fri, 30 Sep 2022 15:08:21 +0800 Subject: [PATCH 118/143] fix: ins_tags table name optimization error --- source/libs/executor/src/scanoperator.c | 78 ++++++++++++++----------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 40fc8cb9a5..2251d09776 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -41,9 +41,9 @@ static int32_t buildDbTableInfoBlock(bool sysInfo, const SSDataBlock* p, const S static bool processBlockWithProbability(const SSampleExecInfo* pInfo); -static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smr, const char* dbname, - const char* tableName, int32_t* pNumOfRows, - const SSDataBlock* dataBlock); +static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable, + SMetaReader* smrChildTable, const char* dbname, const char* tableName, + int32_t* pNumOfRows, const SSDataBlock* dataBlock); static void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t numOfRows, SSDataBlock* dataBlock); bool processBlockWithProbability(const SSampleExecInfo* pInfo) { @@ -2415,11 +2415,10 @@ static bool sysTableIsOperatorCondOnOneTable(SNode* pCond, char* condTable) { strcasecmp(nodesGetNameFromColumnNode(node->pLeft), "table_name") == 0 && nodeType(node->pRight) == QUERY_NODE_VALUE) { SValueNode* pValue = (SValueNode*)node->pRight; - if (pValue->node.type == TSDB_DATA_TYPE_NCHAR || pValue->node.type == TSDB_DATA_TYPE_VARCHAR || - pValue->node.type == TSDB_DATA_TYPE_BINARY) { - char* value = nodesGetStrValueFromNode(pValue); - strncpy(condTable, value, TSDB_TABLE_NAME_LEN); - taosMemoryFree(value); + if (pValue->node.resType.type == TSDB_DATA_TYPE_NCHAR || pValue->node.resType.type == TSDB_DATA_TYPE_VARCHAR || + pValue->node.resType.type == TSDB_DATA_TYPE_BINARY) { + char* value = nodesGetValueFromNode(pValue); + strncpy(condTable, varDataVal(value), TSDB_TABLE_NAME_LEN); return true; } } @@ -2480,18 +2479,28 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; STR_TO_VARSTR(tableName, condTableName); - SMetaReader smr = {0}; - metaReaderInit(&smr, pInfo->readHandle.meta, 0); - metaGetTableEntryByName(&smr, condTableName); - sysTableUserTagsFillOneTableTags(pInfo, &smr, dbname, tableName, &numOfRows, dataBlock); - metaReaderClear(&smr); + SMetaReader smrChildTable = {0}; + metaReaderInit(&smrChildTable, pInfo->readHandle.meta, 0); + metaGetTableEntryByName(&smrChildTable, condTableName); + if (smrChildTable.me.type != TSDB_CHILD_TABLE) { + metaReaderClear(&smrChildTable); + blockDataDestroy(dataBlock); + pInfo->loadInfo.totalRows = 0; + return NULL; + } + SMetaReader smrSuperTable = {0}; + metaReaderInit(&smrSuperTable, pInfo->readHandle.meta, 0); + metaGetTableEntryByUid(&smrSuperTable, smrChildTable.me.ctbEntry.suid); + sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &smrChildTable, dbname, tableName, &numOfRows, dataBlock); + metaReaderClear(&smrSuperTable); + metaReaderClear(&smrChildTable); if (numOfRows > 0) { relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock); numOfRows = 0; } blockDataDestroy(dataBlock); - pInfo->loadInfo.totalRows += pInfo->pRes->info.rows; + doSetOperatorCompleted(pOperator); return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes; } @@ -2508,23 +2517,22 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; STR_TO_VARSTR(tableName, pInfo->pCur->mr.me.name); - SMetaReader smr = {0}; - metaReaderInit(&smr, pInfo->readHandle.meta, 0); - + SMetaReader smrSuperTable = {0}; + metaReaderInit(&smrSuperTable, pInfo->readHandle.meta, 0); uint64_t suid = pInfo->pCur->mr.me.ctbEntry.suid; - int32_t code = metaGetTableEntryByUid(&smr, suid); + int32_t code = metaGetTableEntryByUid(&smrSuperTable, suid); if (code != TSDB_CODE_SUCCESS) { qError("failed to get super table meta, uid:0x%" PRIx64 ", code:%s, %s", suid, tstrerror(terrno), GET_TASKID(pTaskInfo)); - metaReaderClear(&smr); + metaReaderClear(&smrSuperTable); metaCloseTbCursor(pInfo->pCur); pInfo->pCur = NULL; T_LONG_JMP(pTaskInfo->env, terrno); } - sysTableUserTagsFillOneTableTags(pInfo, &smr, dbname, tableName, &numOfRows, dataBlock); + sysTableUserTagsFillOneTableTags(pInfo, &smrSuperTable, &pInfo->pCur->mr, dbname, tableName, &numOfRows, dataBlock); - metaReaderClear(&smr); + metaReaderClear(&smrSuperTable); if (numOfRows >= pOperator->resultInfo.capacity) { relocateAndFilterSysTagsScanResult(pInfo, numOfRows, dataBlock); @@ -2562,15 +2570,15 @@ static void relocateAndFilterSysTagsScanResult(SSysTableScanInfo* pInfo, int32_t blockDataCleanup(dataBlock); } -static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smr, const char* dbname, - const char* tableName, int32_t* pNumOfRows, - const SSDataBlock* dataBlock) { +static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, SMetaReader* smrSuperTable, + SMetaReader* smrChildTable, const char* dbname, const char* tableName, + int32_t* pNumOfRows, const SSDataBlock* dataBlock) { char stableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(stableName, (*smr).me.name); + STR_TO_VARSTR(stableName, (*smrSuperTable).me.name); int32_t numOfRows = *pNumOfRows; - int32_t numOfTags = (*smr).me.stbEntry.schemaTag.nCols; + int32_t numOfTags = (*smrSuperTable).me.stbEntry.schemaTag.nCols; for (int32_t i = 0; i < numOfTags; ++i) { SColumnInfoData* pColInfoData = NULL; @@ -2588,35 +2596,35 @@ static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, // tag name char tagName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(tagName, (*smr).me.stbEntry.schemaTag.pSchema[i].name); + STR_TO_VARSTR(tagName, (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].name); pColInfoData = taosArrayGet(dataBlock->pDataBlock, 3); colDataAppend(pColInfoData, numOfRows, tagName, false); // tag type - int8_t tagType = (*smr).me.stbEntry.schemaTag.pSchema[i].type; + int8_t tagType = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].type; pColInfoData = taosArrayGet(dataBlock->pDataBlock, 4); char tagTypeStr[VARSTR_HEADER_SIZE + 32]; int tagTypeLen = sprintf(varDataVal(tagTypeStr), "%s", tDataTypes[tagType].name); if (tagType == TSDB_DATA_TYPE_VARCHAR) { tagTypeLen += sprintf(varDataVal(tagTypeStr) + tagTypeLen, "(%d)", - (int32_t)((*smr).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE)); + (int32_t)((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE)); } else if (tagType == TSDB_DATA_TYPE_NCHAR) { - tagTypeLen += - sprintf(varDataVal(tagTypeStr) + tagTypeLen, "(%d)", - (int32_t)(((*smr).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE)); + tagTypeLen += sprintf( + varDataVal(tagTypeStr) + tagTypeLen, "(%d)", + (int32_t)(((*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE)); } varDataSetLen(tagTypeStr, tagTypeLen); colDataAppend(pColInfoData, numOfRows, (char*)tagTypeStr, false); STagVal tagVal = {0}; - tagVal.cid = (*smr).me.stbEntry.schemaTag.pSchema[i].colId; + tagVal.cid = (*smrSuperTable).me.stbEntry.schemaTag.pSchema[i].colId; char* tagData = NULL; uint32_t tagLen = 0; if (tagType == TSDB_DATA_TYPE_JSON) { - tagData = (char*)pInfo->pCur->mr.me.ctbEntry.pTags; + tagData = (char*)smrChildTable->me.ctbEntry.pTags; } else { - bool exist = tTagGet((STag*)pInfo->pCur->mr.me.ctbEntry.pTags, &tagVal); + bool exist = tTagGet((STag*)smrChildTable->me.ctbEntry.pTags, &tagVal); if (exist) { if (IS_VAR_DATA_TYPE(tagType)) { tagData = (char*)tagVal.pData; From f3b2067675522118938d27f70b4bcf492a1e04df Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao@163.com> Date: Fri, 30 Sep 2022 14:41:30 +0800 Subject: [PATCH 119/143] fix(stream): sliding error --- source/libs/executor/src/timewindowoperator.c | 20 +++++--- tests/script/tsim/stream/sliding.sim | 48 ++++++++++++++++++- 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index 9b4b7f1ee8..dceb696d54 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -1402,7 +1402,7 @@ static void doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, int3 SResultRowInfo dumyInfo; dumyInfo.cur.pageId = -1; STimeWindow win = getActiveTimeWindow(NULL, &dumyInfo, startTsCols[i], pInterval, TSDB_ORDER_ASC); - while (win.skey <= endTsCols[i]) { + do { uint64_t winGpId = pGpDatas[i]; bool res = doDeleteWindow(pOperator, win.skey, winGpId, numOfOutput); SWinKey winRes = {.ts = win.skey, .groupId = winGpId}; @@ -1413,7 +1413,7 @@ static void doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, int3 taosHashRemove(pUpdatedMap, &winRes, sizeof(SWinKey)); } getNextTimeWindow(pInterval, pInterval->precision, TSDB_ORDER_ASC, &win); - } + } while (win.ekey <= endTsCols[i]); } } @@ -3067,8 +3067,12 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* p int32_t startPos = 0; TSKEY ts = getStartTsKey(&pSDataBlock->info.window, tsCols); - STimeWindow nextWin = - getActiveTimeWindow(pInfo->aggSup.pResultBuf, pResultRowInfo, ts, &pInfo->interval, TSDB_ORDER_ASC); + STimeWindow nextWin = {0}; + if (IS_FINAL_OP(pInfo)) { + nextWin = getFinalTimeWindow(ts, &pInfo->interval); + } else { + nextWin = getActiveTimeWindow(pInfo->aggSup.pResultBuf, pResultRowInfo, ts, &pInfo->interval, TSDB_ORDER_ASC); + } while (1) { bool isClosed = isCloseWindow(&nextWin, &pInfo->twAggSup); if ((pInfo->ignoreExpiredData && isClosed) || !inSlidingWindow(&pInfo->interval, &nextWin, &pSDataBlock->info)) { @@ -3122,8 +3126,12 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* p T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY); } - forwardRows = getNumOfRowsInTimeWindow(&pSDataBlock->info, tsCols, startPos, nextWin.ekey, binarySearchForKey, NULL, - TSDB_ORDER_ASC); + if (IS_FINAL_OP(pInfo)) { + forwardRows = 1; + } else { + forwardRows = getNumOfRowsInTimeWindow(&pSDataBlock->info, tsCols, startPos, nextWin.ekey, binarySearchForKey, + NULL, TSDB_ORDER_ASC); + } if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pUpdatedMap) { saveWinResultInfo(pResult->win.skey, groupId, pUpdatedMap); } diff --git a/tests/script/tsim/stream/sliding.sim b/tests/script/tsim/stream/sliding.sim index bd8d3b0579..b7477fe36c 100644 --- a/tests/script/tsim/stream/sliding.sim +++ b/tests/script/tsim/stream/sliding.sim @@ -369,9 +369,10 @@ endi #$loop_all = 0 #=looptest: -sql drop database IF EXISTS test2; sql drop stream IF EXISTS streams21; sql drop stream IF EXISTS streams22; +sql drop stream IF EXISTS streams23; +sql drop database IF EXISTS test2; sql create database test2 vgroups 6; sql use test2; @@ -381,6 +382,7 @@ sql create table t2 using st tags(2,2,2); sql create stream streams21 trigger at_once into streamt as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from t1 interval(10s, 5s); sql create stream streams22 trigger at_once into streamt2 as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from st interval(10s, 5s); +sql create stream streams23 trigger at_once into streamt3 as select _wstart, count(*) c1, sum(a) c3 , max(b) c4, min(c) c5 from st interval(20s) sliding(10s); sql insert into t1 values(1648791213000,1,1,1,1.0); sql insert into t1 values(1648791223001,2,2,2,1.1); @@ -508,6 +510,50 @@ if $data32 != 8 then goto loop3 endi + +$loop_count = 0 + +loop4: +sleep 100 + +$loop_count = $loop_count + 1 +if $loop_count == 10 then + return -1 +endi + +sql select * from streamt3; + +# row 0 +if $rows != 5 then + print =====rows=$rows + goto loop4 +endi + +if $data01 != 4 then + print =====data01=$data01 + goto loop4 +endi + +if $data11 != 6 then + print =====data11=$data11 + goto loop4 +endi + +if $data21 != 4 then + print =====data21=$data21 + goto loop4 +endi + +if $data31 != 4 then + print =====data31=$data31 + goto loop4 +endi + +if $data41 != 2 then + print =====data41=$data41 + goto loop4 +endi + $loop_all = $loop_all + 1 print ============loop_all=$loop_all From 90c6116373b5166508ebd7caf87e6c9b01460a1f Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 30 Sep 2022 15:42:58 +0800 Subject: [PATCH 120/143] fix mem leak --- source/dnode/vnode/src/meta/metaQuery.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index d499db4958..0309b8177e 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -1145,6 +1145,7 @@ int32_t metaGetTableTagsOpt(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashO if (taosHashGet(tags, id, sizeof(tb_uid_t)) == NULL && 0 == tdbTbGet(pMeta->pCtbIdx, &ctbIdxKey, sizeof(SCtbIdxKey), &val, &len)) { taosHashPut(tags, id, sizeof(tb_uid_t), val, len); + tdbFree(val); } } return 0; From 4b1e8e0cec107981bfc187d38634b242e68a8f9b Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 30 Sep 2022 16:02:28 +0800 Subject: [PATCH 121/143] fix(query): fix memory leak. --- source/dnode/vnode/src/tsdb/tsdbCache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 3a921349e6..845b045360 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -447,7 +447,7 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) { if (--state->iFileSet >= 0) { pFileSet = (SDFileSet *)taosArrayGet(state->aDFileSet, state->iFileSet); } else { - // tMergeTreeClose(&state->mergeTree); + tMergeTreeClose(&state->mergeTree); *ppRow = NULL; return code; @@ -463,7 +463,7 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) { bool hasVal = tMergeTreeNext(&state->mergeTree); if (!hasVal) { state->state = SFSLASTNEXTROW_FILESET; - // tMergeTreeClose(&state->mergeTree); + tMergeTreeClose(&state->mergeTree); goto _next_fileset; } state->state = SFSLASTNEXTROW_BLOCKROW; From 877c707ce6096a66460b7c1194d092231c4003bd Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 30 Sep 2022 17:10:55 +0800 Subject: [PATCH 122/143] fix(query): fix memory leak in last_row query --- source/dnode/vnode/src/tsdb/tsdbCache.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 845b045360..6e27d70096 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -590,7 +590,10 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) { goto _next_fileset; } - tMapDataReset(&state->blockMap); + if (state->blockMap.pData != NULL) { + tMapDataClear(&state->blockMap); + } + code = tsdbReadDataBlk(state->pDataFReader, state->pBlockIdx, &state->blockMap); if (code) goto _err; @@ -695,6 +698,10 @@ int32_t clearNextRowFromFS(void *iter) { state->pBlockData = NULL; } + if (state->blockMap.pData != NULL) { + tMapDataClear(&state->blockMap); + } + return code; } From 738fddb8149e842f7ccb53eafe46f92754e43806 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 30 Sep 2022 17:49:08 +0800 Subject: [PATCH 123/143] fix coverity scan problem --- source/libs/index/src/indexFilter.c | 4 ++-- source/libs/index/src/indexFst.c | 10 +++++++--- source/libs/index/src/indexFstDfa.c | 1 + source/libs/index/src/indexTfile.c | 13 ++++++++++--- source/libs/transport/src/transCli.c | 2 +- source/libs/transport/src/transComm.c | 2 +- source/libs/transport/src/transSvr.c | 6 +++--- source/os/src/osSocket.c | 1 - 8 files changed, 25 insertions(+), 14 deletions(-) diff --git a/source/libs/index/src/indexFilter.c b/source/libs/index/src/indexFilter.c index b65acc4672..6d81499dbc 100644 --- a/source/libs/index/src/indexFilter.c +++ b/source/libs/index/src/indexFilter.c @@ -468,6 +468,7 @@ static int32_t sifDoIndex(SIFParam *left, SIFParam *right, int8_t operType, SIFP SIndexMultiTermQuery *mtm = indexMultiTermQueryCreate(MUST); indexMultiTermQueryAdd(mtm, tm, qtype); ret = indexJsonSearch(arg->ivtIdx, mtm, output->result); + indexMultiTermQueryDestroy(mtm); } else { bool reverse; FilterFunc filterFunc = sifGetFilterFunc(qtype, &reverse); @@ -647,9 +648,8 @@ static int32_t sifExecOper(SOperatorNode *node, SIFCtx *ctx, SIFParam *output) { SIF_ERR_RET(sifInitOperParams(¶ms, node, ctx)); if (params[0].status == SFLT_NOT_INDEX && (nParam > 1 && params[1].status == SFLT_NOT_INDEX)) { - for (int i = 0; i < nParam; i++) sifFreeParam(¶ms[i]); output->status = SFLT_NOT_INDEX; - return code; + goto _return; } // ugly code, refactor later diff --git a/source/libs/index/src/indexFst.c b/source/libs/index/src/indexFst.c index 2aa8345e03..5e787f9503 100644 --- a/source/libs/index/src/indexFst.c +++ b/source/libs/index/src/indexFst.c @@ -1025,6 +1025,7 @@ void fstDestroy(Fst* fst) { } bool fstGet(Fst* fst, FstSlice* b, Output* out) { + int ret = false; FstNode* root = fstGetRoot(fst); Output tOut = 0; int32_t len; @@ -1037,7 +1038,7 @@ bool fstGet(Fst* fst, FstSlice* b, Output* out) { uint8_t inp = data[i]; Output res = 0; if (false == fstNodeFindInput(root, inp, &res)) { - return false; + goto _return; } FstTransition trn; @@ -1047,18 +1048,20 @@ bool fstGet(Fst* fst, FstSlice* b, Output* out) { taosArrayPush(nodes, &root); } if (!FST_NODE_IS_FINAL(root)) { - return false; + goto _return; } else { tOut = tOut + FST_NODE_FINAL_OUTPUT(root); + ret = true; } +_return: for (int32_t i = 0; i < taosArrayGetSize(nodes); i++) { FstNode** node = (FstNode**)taosArrayGet(nodes, i); fstNodeDestroy(*node); } taosArrayDestroy(nodes); *out = tOut; - return true; + return ret; } FStmBuilder* fstSearch(Fst* fst, FAutoCtx* ctx) { // refactor later @@ -1243,6 +1246,7 @@ bool stmStSeekMin(FStmSt* sws, FstBoundWithData* min) { StreamState s = {.node = node, .trans = i, .out = {.null = false, .out = out}, .autState = autState}; taosArrayPush(sws->stack, &s); + taosMemoryFree(trans); return true; } } diff --git a/source/libs/index/src/indexFstDfa.c b/source/libs/index/src/indexFstDfa.c index 3a36010b42..8ce0ba1e69 100644 --- a/source/libs/index/src/indexFstDfa.c +++ b/source/libs/index/src/indexFstDfa.c @@ -139,6 +139,7 @@ bool dfaBuilderCacheState(FstDfaBuilder *builder, FstSparseSet *set, uint32_t *r } } if (taosArrayGetSize(tinsts) == 0) { + taosArrayDestroy(tinsts); return false; } uint32_t *v = taosHashGet(builder->cache, &tinsts, sizeof(POINTER_BYTES)); diff --git a/source/libs/index/src/indexTfile.c b/source/libs/index/src/indexTfile.c index f3009c051b..e746bb4303 100644 --- a/source/libs/index/src/indexTfile.c +++ b/source/libs/index/src/indexTfile.c @@ -267,10 +267,12 @@ static int32_t tfSearchPrefix(void* reader, SIndexTerm* tem, SIdxTRslt* tr) { uint64_t offset = *(uint64_t*)taosArrayGet(offsets, i); ret = tfileReaderLoadTableIds((TFileReader*)reader, offset, tr->total); if (ret != 0) { + taosArrayDestroy(offsets); indexError("failed to find target tablelist"); return TSDB_CODE_TDB_FILE_CORRUPTED; } } + taosArrayDestroy(offsets); return 0; } static int32_t tfSearchSuffix(void* reader, SIndexTerm* tem, SIdxTRslt* tr) { @@ -336,6 +338,7 @@ static int32_t tfSearchCompareFunc(void* reader, SIndexTerm* tem, SIdxTRslt* tr, } stmStDestroy(st); stmBuilderDestroy(sb); + taosArrayDestroy(offsets); return TSDB_CODE_SUCCESS; } static int32_t tfSearchLessThan(void* reader, SIndexTerm* tem, SIdxTRslt* tr) { @@ -379,6 +382,7 @@ static int32_t tfSearchTerm_JSON(void* reader, SIndexTerm* tem, SIdxTRslt* tr) { ", size: %d, time cost: %" PRIu64 "us", tem->suid, tem->colName, tem->colVal, offset, (int)taosArrayGetSize(tr->total), cost); } + taosMemoryFree(p); fstSliceDestroy(&key); return 0; } @@ -471,6 +475,9 @@ static int32_t tfSearchCompareFunc_JSON(void* reader, SIndexTerm* tem, SIdxTRslt } stmStDestroy(st); stmBuilderDestroy(sb); + taosArrayDestroy(offsets); + taosMemoryFree(p); + return TSDB_CODE_SUCCESS; } int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SIdxTRslt* tr) { @@ -898,9 +905,8 @@ static int tfileReaderLoadFst(TFileReader* reader) { int64_t ts = taosGetTimestampUs(); int32_t nread = ctx->readFrom(ctx, buf, fstSize, reader->header.fstOffset); int64_t cost = taosGetTimestampUs() - ts; - indexInfo("nread = %d, and fst offset=%d, fst size: %d, filename: %s, file size: %" PRId64 ", time cost: %" PRId64 - "us", - nread, reader->header.fstOffset, fstSize, ctx->file.buf, size, cost); + indexInfo("nread = %d, and fst offset=%d, fst size: %d, filename: %s, file size: %d, time cost: %" PRId64 "us", nread, + reader->header.fstOffset, fstSize, ctx->file.buf, size, cost); // we assuse fst size less than FST_MAX_SIZE assert(nread > 0 && nread <= fstSize); @@ -989,6 +995,7 @@ static SArray* tfileGetFileList(const char* path) { TdDirPtr pDir = taosOpenDir(path); if (NULL == pDir) { + taosArrayDestroy(files); return NULL; } TdDirEntryPtr pDirEntry; diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 191011111d..ff4fae3de8 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -1347,7 +1347,7 @@ int cliAppCb(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) { EPSET_FORWARD_INUSE(&pCtx->epSet); } else { if (tDeserializeSEpSet(pResp->pCont, pResp->contLen, &pCtx->epSet) < 0) { - tError("%s conn %p failed to deserialize epset", CONN_GET_INST_LABEL(pConn)); + tError("%s conn %p failed to deserialize epset", CONN_GET_INST_LABEL(pConn), pConn); } } addConnToPool(pThrd->pool, pConn); diff --git a/source/libs/transport/src/transComm.c b/source/libs/transport/src/transComm.c index ae9f3155b4..e86314d4bd 100644 --- a/source/libs/transport/src/transComm.c +++ b/source/libs/transport/src/transComm.c @@ -509,7 +509,7 @@ void transDQCancel(SDelayQueue* queue, SDelayTask* task) { if (heapSize(queue->heap) != 0) { HeapNode* minNode = heapMin(queue->heap); - if (minNode != NULL) return; + if (minNode == NULL) return; uint64_t now = taosGetTimestampMs(); SDelayTask* task = container_of(minNode, SDelayTask, node); diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index 70a47fe079..56c70a4350 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -284,7 +284,7 @@ void uvOnRecvCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf) { } return; } else { - tError("%s conn %p read invalid packet, exceed limit, received from %s, local info:", transLabel(pTransInst), + tError("%s conn %p read invalid packet, exceed limit, received from %s, local info:%s", transLabel(pTransInst), conn, conn->dst, conn->src); destroyConn(conn, true); return; @@ -952,10 +952,10 @@ void* transInitServer(uint32_t ip, uint32_t port, char* label, int numOfThreads, #ifdef WINDOWS char pipeName[64]; - snprintf(pipeName, sizeof(pipeName), "\\\\?\\pipe\\trans.rpc.%p-" PRIu64, taosSafeRand(), GetCurrentProcessId()); + snprintf(pipeName, sizeof(pipeName), "\\\\?\\pipe\\trans.rpc.%p-%" PRIu64, taosSafeRand(), GetCurrentProcessId()); #else char pipeName[PATH_MAX] = {0}; - snprintf(pipeName, sizeof(pipeName), "%s%spipe.trans.rpc.%08X-" PRIu64, tsTempDir, TD_DIRSEP, taosSafeRand(), + snprintf(pipeName, sizeof(pipeName), "%s%spipe.trans.rpc.%08X-%" PRIu64, tsTempDir, TD_DIRSEP, taosSafeRand(), taosGetSelfPthreadId()); #endif ret = uv_pipe_bind(&srv->pipeListen, pipeName); diff --git a/source/os/src/osSocket.c b/source/os/src/osSocket.c index b34d071773..c1e02b48aa 100644 --- a/source/os/src/osSocket.c +++ b/source/os/src/osSocket.c @@ -801,7 +801,6 @@ TdSocketServerPtr taosOpenTcpServerSocket(uint32_t ip, uint16_t port) { if (taosKeepTcpAlive(pSocket) < 0) { // printf("failed to set tcp server keep-alive option, 0x%x:%hu(%s)", ip, port, strerror(errno)); - taosCloseSocket(&pSocket); return NULL; } From 3d1bf6f50d8d88752933b829762f987019db7040 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Fri, 30 Sep 2022 17:57:04 +0800 Subject: [PATCH 124/143] fix: query information_schema.ins_tags error --- source/libs/parser/src/parTranslater.c | 78 +++----------------------- source/libs/parser/src/parUtil.c | 6 +- 2 files changed, 14 insertions(+), 70 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index b58626e6fb..882fa8950c 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -2181,7 +2181,11 @@ static int32_t getTagsTableVgroupListImpl(STranslateContext* pCxt, SName* pTarge } if (TSDB_DB_NAME_T == pTargetName->type) { - return getDBVgInfoImpl(pCxt, pTargetName, pVgroupList); + int32_t code = getDBVgInfoImpl(pCxt, pTargetName, pVgroupList); + if (TSDB_CODE_MND_DB_NOT_EXIST == code) { + code = TSDB_CODE_SUCCESS; + } + return code; } SVgroupInfo vgInfo = {0}; @@ -2190,79 +2194,15 @@ static int32_t getTagsTableVgroupListImpl(STranslateContext* pCxt, SName* pTarge *pVgroupList = taosArrayInit(1, sizeof(SVgroupInfo)); if (NULL == *pVgroupList) { code = TSDB_CODE_OUT_OF_MEMORY; + } else { + taosArrayPush(*pVgroupList, &vgInfo); } - } - if (TSDB_CODE_SUCCESS == code) { - taosArrayPush(*pVgroupList, &vgInfo); + } else if (TSDB_CODE_MND_DB_NOT_EXIST == code) { + code = TSDB_CODE_SUCCESS; } return code; } -// static int32_t getTagsTableTargetNameFromOp(STranslateContext* pCxt, SOperatorNode* pOper, SName* pName) { -// if (OP_TYPE_EQUAL != pOper->opType) { -// return TSDB_CODE_SUCCESS; -// } - -// SColumnNode* pCol = NULL; -// SValueNode* pVal = NULL; -// if (QUERY_NODE_COLUMN == nodeType(pOper->pLeft)) { -// pCol = (SColumnNode*)pOper->pLeft; -// } else if (QUERY_NODE_VALUE == nodeType(pOper->pLeft)) { -// pVal = (SValueNode*)pOper->pLeft; -// } -// if (QUERY_NODE_COLUMN == nodeType(pOper->pRight)) { -// pCol = (SColumnNode*)pOper->pRight; -// } else if (QUERY_NODE_VALUE == nodeType(pOper->pRight)) { -// pVal = (SValueNode*)pOper->pRight; -// } -// if (NULL == pCol || NULL == pVal) { -// return TSDB_CODE_SUCCESS; -// } - -// if (0 == strcmp(pCol->colName, "db_name")) { -// return tNameSetDbName(pName, pCxt->pParseCxt->acctId, pVal->literal, strlen(pVal->literal)); -// } else if (0 == strcmp(pCol->colName, "table_name")) { -// return tNameAddTbName(pName, pVal->literal, strlen(pVal->literal)); -// } - -// return TSDB_CODE_SUCCESS; -// } - -// static void getTagsTableTargetObjName(STranslateContext* pCxt, SNode* pNode, SName* pName) { -// if (QUERY_NODE_OPERATOR == nodeType(pNode)) { -// getTagsTableTargetNameFromOp(pCxt, (SOperatorNode*)pNode, pName); -// } -// } - -// static int32_t getTagsTableTargetNameFromCond(STranslateContext* pCxt, SLogicConditionNode* pCond, SName* pName) { -// if (LOGIC_COND_TYPE_AND != pCond->condType) { -// return TSDB_CODE_SUCCESS; -// } - -// SNode* pNode = NULL; -// FOREACH(pNode, pCond->pParameterList) { getTagsTableTargetObjName(pCxt, pNode, pName); } -// if ('\0' == pName->dbname[0]) { -// pName->type = 0; -// } -// return TSDB_CODE_SUCCESS; -// } - -// static int32_t getTagsTableTargetName(STranslateContext* pCxt, SNode* pWhere, SName* pName) { -// if (NULL == pWhere) { -// return TSDB_CODE_SUCCESS; -// } - -// if (QUERY_NODE_OPERATOR == nodeType(pWhere)) { -// return getTagsTableTargetNameFromOp(pCxt, (SOperatorNode*)pWhere, pName); -// } - -// if (QUERY_NODE_LOGIC_CONDITION == nodeType(pWhere)) { -// return getTagsTableTargetNameFromCond(pCxt, (SLogicConditionNode*)pWhere, pName); -// } - -// return TSDB_CODE_SUCCESS; -// } - static int32_t getTagsTableVgroupList(STranslateContext* pCxt, SName* pName, SArray** pVgroupList) { if (!isSelectStmt(pCxt->pCurrStmt)) { return TSDB_CODE_SUCCESS; diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c index c6a51f22e8..dab1f01574 100644 --- a/source/libs/parser/src/parUtil.c +++ b/source/libs/parser/src/parUtil.c @@ -475,7 +475,11 @@ int32_t getInsTagsTableTargetName(int32_t acctId, SNode* pWhere, SName* pName) { } if (QUERY_NODE_OPERATOR == nodeType(pWhere)) { - return getInsTagsTableTargetNameFromOp(acctId, (SOperatorNode*)pWhere, pName); + int32_t code = getInsTagsTableTargetNameFromOp(acctId, (SOperatorNode*)pWhere, pName); + if (TSDB_CODE_SUCCESS == code && '\0' == pName->dbname[0]) { + pName->type = 0; + } + return code; } if (QUERY_NODE_LOGIC_CONDITION == nodeType(pWhere)) { From ca041b6dd07b872a4e7de055797245cce27adb1f Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 30 Sep 2022 20:02:51 +0800 Subject: [PATCH 125/143] fix(tsc): fix invalid free --- source/libs/transport/src/transSvr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index 56c70a4350..c63f8f398b 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -952,10 +952,10 @@ void* transInitServer(uint32_t ip, uint32_t port, char* label, int numOfThreads, #ifdef WINDOWS char pipeName[64]; - snprintf(pipeName, sizeof(pipeName), "\\\\?\\pipe\\trans.rpc.%p-%" PRIu64, taosSafeRand(), GetCurrentProcessId()); + snprintf(pipeName, sizeof(pipeName), "\\\\?\\pipe\\trans.rpc.%d-%" PRIu64, taosSafeRand(), GetCurrentProcessId()); #else char pipeName[PATH_MAX] = {0}; - snprintf(pipeName, sizeof(pipeName), "%s%spipe.trans.rpc.%08X-%" PRIu64, tsTempDir, TD_DIRSEP, taosSafeRand(), + snprintf(pipeName, sizeof(pipeName), "%s%spipe.trans.rpc.%08d-%" PRIu64, tsTempDir, TD_DIRSEP, taosSafeRand(), taosGetSelfPthreadId()); #endif ret = uv_pipe_bind(&srv->pipeListen, pipeName); From 16c14738234ca004c3f4237837e677f27b019858 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sat, 1 Oct 2022 13:49:22 +0800 Subject: [PATCH 126/143] enh(query): opt get table meta --- source/dnode/vnode/inc/vnode.h | 4 +- source/dnode/vnode/src/meta/metaQuery.c | 57 ++++++++++++++++++------- source/libs/executor/src/executil.c | 2 +- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index fec050b5ea..4d228f742a 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -96,7 +96,7 @@ void metaReaderClear(SMetaReader *pReader); int32_t metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid); int metaGetTableEntryByName(SMetaReader *pReader, const char *name); int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags); -int32_t metaGetTableTagsOpt(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags); +int32_t metaGetTableTagsByUids(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags); int32_t metaReadNext(SMetaReader *pReader); const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal); int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName); @@ -159,7 +159,7 @@ uint64_t getReaderMaxVersion(STsdbReader *pReader); int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, SArray *pTableIdList, int32_t numOfCols, void **pReader); int32_t tsdbRetrieveCacheRows(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, SArray *pTableUids); -void* tsdbCacherowsReaderClose(void *pReader); +void *tsdbCacherowsReaderClose(void *pReader); int32_t tsdbGetTableSchema(SVnode *pVnode, int64_t uid, STSchema **pSchema, int64_t *suid); void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity); diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 0309b8177e..3c9f964ff6 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -207,17 +207,17 @@ int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid) { SMetaReader mr = {0}; metaReaderInit(&mr, (SMeta *)meta, 0); - SMeta *pMeta = mr.pMeta; SMetaReader *pReader = &mr; // query name.idx - if (tdbTbGet(pMeta->pNameIdx, tbName, strlen(tbName) + 1, &pReader->pBuf, &pReader->szBuf) < 0) { + if (tdbTbGet(pReader->pMeta->pNameIdx, tbName, strlen(tbName) + 1, &pReader->pBuf, &pReader->szBuf) < 0) { terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; metaReaderClear(&mr); return -1; } *uid = *(tb_uid_t *)pReader->pBuf; + metaReaderClear(&mr); return 0; @@ -228,11 +228,11 @@ int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType) { SMetaReader mr = {0}; metaReaderInit(&mr, (SMeta *)meta, 0); - if (metaGetTableEntryByName(&mr, tbName) == 0) { - *tbType = mr.me.type; - } + code = metaGetTableEntryByName(&mr, tbName); + if (code == 0) *tbType = mr.me.type; + metaReaderClear(&mr); - return 0; + return code; } int metaReadNext(SMetaReader *pReader) { @@ -1134,22 +1134,49 @@ END: return ret; } -int32_t metaGetTableTagsOpt(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) { +static int32_t metaGetTableTagByUid(SMeta *pMeta, uint64_t suid, uint64_t uid, void **tag, int32_t *len, bool lock) { + int ret = 0; + if (lock) { + metaRLock(pMeta); + } + + SCtbIdxKey ctbIdxKey = {.suid = suid, .uid = uid}; + ret = tdbTbGet(pMeta->pCtbIdx, &ctbIdxKey, sizeof(SCtbIdxKey), tag, len); + if (lock) { + metaULock(pMeta); + } + + return ret; +} +int32_t metaGetTableTagsByUids(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) { + const int32_t LIMIT = 128; + + int32_t isLock = false; int32_t sz = uidList ? taosArrayGetSize(uidList) : 0; for (int i = 0; i < sz; i++) { - tb_uid_t *id = taosArrayGet(uidList, i); - SCtbIdxKey ctbIdxKey = {.suid = suid, .uid = *id}; + tb_uid_t *id = taosArrayGet(uidList, i); - void *val = NULL; - int32_t len = 0; - if (taosHashGet(tags, id, sizeof(tb_uid_t)) == NULL && - 0 == tdbTbGet(pMeta->pCtbIdx, &ctbIdxKey, sizeof(SCtbIdxKey), &val, &len)) { - taosHashPut(tags, id, sizeof(tb_uid_t), val, len); - tdbFree(val); + if (i % LIMIT == 0) { + if (isLock) metaULock(pMeta); + + metaRLock(pMeta); + isLock = true; + } + + if (taosHashGet(tags, id, sizeof(tb_uid_t)) == NULL) { + void *val = NULL; + int32_t len = 0; + if (metaGetTableTagByUid(pMeta, suid, *id, &val, &len, false) == 0) { + taosHashPut(tags, id, sizeof(tb_uid_t), val, len); + tdbFree(val); + } } } + if (isLock) metaULock(pMeta); + return 0; } + int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList, SHashObj *tags) { SMCtbCursor *pCur = metaOpenCtbCursor(pMeta, suid); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 38304bcc76..ee2aa5c3fa 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -420,7 +420,7 @@ static SColumnInfoData* getColInfoResult(void* metaHandle, uint64_t suid, SArray goto end; } } else { - metaGetTableTagsOpt(metaHandle, suid, uidList, tags); + metaGetTableTagsByUids(metaHandle, suid, uidList, tags); qInfo("succ to get table from meta idx, suid:%" PRIu64, suid); } From 14283283e47bce0f9ddff6079fc232e4e99fa340 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 7 Oct 2022 23:03:31 +0800 Subject: [PATCH 127/143] more --- include/common/tdataformat.h | 13 +++++++++++++ source/common/src/tdataformat.c | 24 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h index 10cb72f5d0..a1fefa6902 100644 --- a/include/common/tdataformat.h +++ b/include/common/tdataformat.h @@ -27,6 +27,7 @@ extern "C" { #endif +typedef struct SBuffer SBuffer; typedef struct SSchema SSchema; typedef struct STColumn STColumn; typedef struct STSchema STSchema; @@ -56,6 +57,18 @@ const static uint8_t BIT2_MAP[4][4] = {{0b00000000, 0b00000001, 0b00000010, 0}, #define SET_BIT2(p, i, v) ((p)[(i) >> 2] = (p)[(i) >> 2] & N1(BIT2_MAP[(i)&3][3]) | BIT2_MAP[(i)&3][(v)]) #define GET_BIT2(p, i) (((p)[(i) >> 2] >> BIT2_MAP[(i)&3][3]) & ((uint8_t)3)) +// SBuffer ================================ +struct SBuffer { + int64_t nBuf; + uint8_t *pBuf; +}; + +#define tBufferCreate() \ + (SBuffer) { .nBuf = 0, .pBuf = NULL } +void tBufferDestroy(SBuffer *pBuffer); +int32_t tBufferInit(SBuffer *pBuffer, int64_t size); +int32_t tBufferPut(SBuffer *pBuffer, const void *pData, int64_t nData); + // STSchema ================================ int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema **ppTSchema); void tTSchemaDestroy(STSchema *pTSchema); diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index e461e06158..110c3bc8f4 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -20,6 +20,30 @@ #include "tdatablock.h" #include "tlog.h" +// SBuffer ================================ +void tBufferDestroy(SBuffer *pBuffer) { + tFree(pBuffer->pBuf); + pBuffer->pBuf = NULL; +} + +int32_t tBufferInit(SBuffer *pBuffer, int64_t size) { + pBuffer->nBuf = 0; + return tRealloc(&pBuffer->pBuf, size); +} + +int32_t tBufferPut(SBuffer *pBuffer, const void *pData, int64_t nData) { + int32_t code = 0; + + code = tRealloc(&pBuffer->pBuf, pBuffer->nBuf + nData); + if (code) return code; + + memcpy(pBuffer->pBuf + pBuffer->nBuf, pData, nData); + pBuffer->nBuf += nData; + + return code; +} + +// ================================ static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson); #pragma pack(push, 1) From d05b134a48adeb404b0b1954d6480c5b3c04d953 Mon Sep 17 00:00:00 2001 From: Zhiqiang Wang <1296468573@qq.com> Date: Sat, 8 Oct 2022 10:12:17 +0800 Subject: [PATCH 128/143] os: Mac package (#17201) * os: Mac package * os: Mac package * os: Mac package * os: Mac package * os: Mac package * os: Mac package * os: Mac package * os: Mac package * os: Mac package * os: Mac package * os: Mac package * os: Mac package --- README-CN.md | 28 ++- README.md | 31 ++- docs/en/05-get-started/03-package.md | 13 ++ docs/zh/05-get-started/03-package.md | 13 ++ include/os/osDir.h | 6 +- packaging/tools/TDengine | 28 +++ packaging/tools/com.taosdata.taosd.plist | 33 +++ packaging/tools/logo.png | Bin 0 -> 15645 bytes packaging/tools/mac_before_install.txt | 5 + packaging/tools/make_install.sh | 268 +++++++++++------------ packaging/tools/post.sh | 111 ++++++++-- packaging/tools/remove.sh | 40 +++- source/libs/stream/src/streamMeta.c | 2 +- source/libs/tdb/src/db/tdbDb.c | 2 +- source/os/src/osDir.c | 11 +- source/os/src/osEnv.c | 28 +-- tools/CMakeLists.txt | 11 +- tools/shell/CMakeLists.txt | 4 + 18 files changed, 428 insertions(+), 206 deletions(-) create mode 100755 packaging/tools/TDengine create mode 100644 packaging/tools/com.taosdata.taosd.plist create mode 100644 packaging/tools/logo.png create mode 100644 packaging/tools/mac_before_install.txt diff --git a/README-CN.md b/README-CN.md index 0b7e42d4fa..907e87347d 100644 --- a/README-CN.md +++ b/README-CN.md @@ -104,6 +104,12 @@ sudo yum install -y zlib-devel xz-devel snappy-devel jansson jansson-devel pkgco sudo yum config-manager --set-enabled Powertools ``` +### MacOS + +``` +sudo brew install argp-standalone pkgconfig +``` + ### 设置 golang 开发环境 TDengine 包含数个使用 Go 语言开发的组件,比如taosAdapter, 请参考 golang.org 官方文档设置 go 开发环境。 @@ -210,14 +216,14 @@ cmake .. -G "NMake Makefiles" nmake ``` - +``` # 安装 @@ -263,6 +269,24 @@ nmake install sudo make install ``` +用户可以在[文件目录结构](https://docs.taosdata.com/reference/directory/)中了解更多在操作系统中生成的目录或文件。 + +从源代码安装也会为 TDengine 配置服务管理 ,用户也可以选择[从安装包中安装](https://docs.taosdata.com/get-started/package/)。 + +安装成功后,可以在应用程序中双击 TDengine 图标启动服务,或者在终端中启动 TDengine 服务: + +```bash +launchctl start taosd +``` + +用户可以使用 TDengine CLI 来连接 TDengine 服务,在终端中,输入: + +```bash +taos +``` + +如果 TDengine CLI 连接服务成功,将会打印出欢迎消息和版本信息。如果失败,则会打印出错误消息。 + ## 快速运行 如果不希望以服务方式运行 TDengine,也可以在终端中直接运行它。也即在生成完成后,执行以下命令(在 Windows 下,生成的可执行文件会带有 .exe 后缀,例如会名为 taosd.exe ): diff --git a/README.md b/README.md index fe9bb49ed8..69d7cc13ad 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,12 @@ If the PowerTools installation fails, you can try to use: sudo yum config-manager --set-enabled powertools ``` +### MacOS + +``` +sudo brew install argp-standalone pkgconfig +``` + ### Setup golang environment TDengine includes a few components like taosAdapter developed by Go language. Please refer to golang.org official documentation for golang environment setup. @@ -213,14 +219,14 @@ cmake .. -G "NMake Makefiles" nmake ``` - +``` # Installing @@ -258,7 +264,7 @@ After building successfully, TDengine can be installed by: nmake install ``` - + +Users can find more information about directories installed on the system in the [directory and files](https://docs.tdengine.com/reference/directory/) section. + +Installing from source code will also configure service management for TDengine.Users can also choose to [install from packages](https://docs.tdengine.com/get-started/package/) for it. + +To start the service after installation, double-click the /applications/TDengine to start the program, or in a terminal, use: + +```bash +launchctl start taosd +``` + +Then users can use the TDengine CLI to connect the TDengine server. In a terminal, use: + +```bash +taos +``` + +If TDengine CLI connects the server successfully, welcome messages and version info are printed. Otherwise, an error message is shown. ## Quick Run diff --git a/docs/en/05-get-started/03-package.md b/docs/en/05-get-started/03-package.md index 25a92573fa..328e43c4f7 100644 --- a/docs/en/05-get-started/03-package.md +++ b/docs/en/05-get-started/03-package.md @@ -111,6 +111,13 @@ Note: TDengine only supports Windows Server 2016/2019 and Windows 10/11 on the W 2. Run the downloaded package to install TDengine. + + + +1. Download the Mac installation package. + +2. Run the downloaded package to install TDengine. + @@ -178,6 +185,12 @@ The following `systemctl` commands can help you manage TDengine service: After the installation is complete, run `C:\TDengine\taosd.exe` to start TDengine Server. + + + + +After the installation is complete, double-click the /applications/TDengine to start the program, or run `launchctl start taosd` to start TDengine Server. + diff --git a/docs/zh/05-get-started/03-package.md b/docs/zh/05-get-started/03-package.md index 2c857d37f3..cec430accf 100644 --- a/docs/zh/05-get-started/03-package.md +++ b/docs/zh/05-get-started/03-package.md @@ -110,6 +110,13 @@ apt-get 方式只适用于 Debian 或 Ubuntu 系统。 2. 运行可执行程序来安装 TDengine。 + + + +1. 从列表中下载获得 pkg 安装程序; + +2. 运行可执行程序来安装 TDengine。 + @@ -177,6 +184,12 @@ Active: inactive (dead) 安装后,在 `C:\TDengine` 目录下,运行 `taosd.exe` 来启动 TDengine 服务进程。 + + + + +安装后,在应用程序目录下,双击 TDengine 来启动程序,也可以运行 `launchctl start taosd` 来启动 TDengine 服务进程。 + diff --git a/include/os/osDir.h b/include/os/osDir.h index 95b1a6ee1d..2bdc99d268 100644 --- a/include/os/osDir.h +++ b/include/os/osDir.h @@ -38,9 +38,9 @@ extern "C" { #define TD_LOG_DIR_PATH "C:\\TDengine\\log\\" #elif defined(_TD_DARWIN_64) #define TD_TMP_DIR_PATH "/tmp/taosd/" -#define TD_CFG_DIR_PATH "/usr/local/etc/taos/" -#define TD_DATA_DIR_PATH "/usr/local/var/lib/taos/" -#define TD_LOG_DIR_PATH "/usr/local/var/log/taos/" +#define TD_CFG_DIR_PATH "/etc/taos/" +#define TD_DATA_DIR_PATH "/var/lib/taos/" +#define TD_LOG_DIR_PATH "/var/log/taos/" #else #define TD_TMP_DIR_PATH "/tmp/" #define TD_CFG_DIR_PATH "/etc/taos/" diff --git a/packaging/tools/TDengine b/packaging/tools/TDengine new file mode 100755 index 0000000000..3025a5639f --- /dev/null +++ b/packaging/tools/TDengine @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + + +function showAlertMessage(){ +osascript < + + + + Label + taosd + ProgramArguments + + /usr/local/bin/taosd + + ProcessType + Interactive + Disabled + + RunAtLoad + + LaunchOnlyOnce + + SessionCreate + + ExitTimeOut + 600 + KeepAlive + + SuccessfulExit + + AfterInitialDemand + + + Program + /usr/local/bin/taosd + + \ No newline at end of file diff --git a/packaging/tools/logo.png b/packaging/tools/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e739e5dd8c4b01b93e8c98606def3ae9adae257b GIT binary patch literal 15645 zcmaKTQ*>obv~_H|V{~kzlMcIM+dQ#tp4c6AY}?j}oeoaWv2AvA^F96JzYq6ek3IGt zgA$3TFA3i^LH#1Y{1hGJayLbrTUf2PWci306e6PGc*gTI`+2o0|bz7Vg) z-x9oc!!{EH7)sY7+WFxo>G&o24aVe!UM{gEMA${m126Sg2L}c0_e%4S3octNL+Bbx zs2~Kq?Cx9)BUfo<;u8<#<|G zcRwsm{2-Ah3-$CflnIU-MQuB8FtW`lYoV@%KO8<`kjMh?9Qd~c+dp54i3~Qc>br&x zTzByblbPcXCV~WNDsHb7U2-fWLuEW!$oILmM6y`qcoFh2lqsWdWDh$4-T1gaPm%n0 zzn#GgX2<)_DnkUE^u4mN>3tQP5%h(Q#1{}yL1hRS5K9QXj8Fi85TUUHuTHbh=ajJ{ zaI~ASY>~fg)le8)Y%7psM2IHxthiw^RLaj#RyTUcuA#y}Z6j7!(^4l7S;OMs3DR!G zea^PSX;j@UjG{zZeKsP3ODNO2@vlpNz)Nek|c`U2(i zkA{Ydkncph#$8e+5BhvI727fPf$sqqB*K@M{wgab-BlO|Dmdj5Lm&9BB3hprQEc4@ zotbg9?PPto(|>(->Pju2f7W~?{M#wHQ}g-l9-)9)G&dQ-%(umXrIkch}!IaE0KSfi3lxVB7!nsjBAC6R(StE| zHYrs7_Ggmzt3h*sh2H7pd36JP(sz!*M5ELGW}Hj5!bBYR+SMO+hu?HrDx^z!Gec1> zn4l8bxIFeG#qZmc@J?mMch_;o0=iFx>8gn87V`Xl@>-@n`NT(BREtZegK-Yi23(JUXNk-8F(2+(&`(0Cr`LJ68{cPbhf*J9Pux4@r7=bKM4# zRY;AarrzthYbpuEIBGFOkP36_|Ct@lEON8$UR#??3JNIlJ;AjY9=PX=K|Q;NN6^vl$ig*fSF3`~AnV2f6Oi;pKleGnVg2gp-ri z?k2Z*3e>Y`wmqEWl`E6!ihfPZy0+N9bJ?B3f%NjytpIkw@XsW&sW3;i++QluMK+X( z6eEWcE8*T`LfdXMSQzT)CzVnxi4}cyU#0VH{Xp>QOpSi`9gV8>D`9!>UM#KxL}I1m z2YXu76#!MTbV^#CB9#nasF8!NFhw-0uz89njUx894q)&qvFwQ!xTSla|13*$-d7}( z86y|<-a97PakI^eRn0`_3S+J+JEl#&hofppEF1C4&)W!@`qTJyV7BjJMi8#CiRliB{tFK;_@|_W z#`$T%UWHKJ7k?2geLT)owvemx9#e2&k}t@F8kZwIV*jSzxT|X+XYqs@Tv7V>x$g%J zxO^tTouuQ|=|7K*dn_QknF|ajsIk)tO@w2snV8>)Rm$t`$CU6|D;@Y|Pa-z&IuP={ z?mYZimWUNm%OhTWip%J)xkad|#U0=6S4;Khm)obWsvP>oeJ9#nRs5E`C5UhT$O^pI zPuRu*pAy%p>0=Ynyp)<>;hAy&AlGwvui4&#Ac0M01)PLW%aiP}1}qv`VugeE^}Vg% zI_W_VF3MVIq0e@GxHSHcN>b#WRnI;dWB%}5LUefuz*sm(Vb^ah4dC6at_3Mi9~d1q zI%R`|4FHK&(D(L?=&zyoYB=Nh*ANpwx_c)bm%P#+d^y{a=xQQ5!g3fD?gW_d=(ESX zGj%9@aKG-^}IPIYf0!s zaVURDB2g_VyY?%qj`{@d5E1Ya50fJrvB2ih|TCXSDW87Qrzx2K>)FKB`a@w*zSjiZaUc^ z7%wbKK_;d2jc7nW=u1QaCaYVMTDzFC8^uS3=vNr z15p?H3ykj0D&{hloA@-c*Cq^D3hd`E^VTT7PX$QauSV#tXP)-tIW$ zCuaA28Ys2(q1v>5wtZ=XXLQh!#uU88D&f1GJmdw(iw@so{`txp7@ zZa{Nk83IfJB4xoURF^KKVx1av4bhw{_C`%={)5TuIXiVo&}7(fF}W;4zKTP}AN@b% z(q9o2@e}JjjP$RI$P0wl+Xa>f?vG9nw~XIVBnH^mjqNMY5X9d9&q^OV9;spg7$Ij5JmnYJC;hp5Nhn zoF?oBpw*#)k*S@Hw0a#L@ftkfIzoMa67Ne??LOwY4n;>OkIp&_C#~r2MvB2$1U20k z+4|GH=Z80VvnMg`nY{SXbZh_12{mrXUfzd_L)ixzvy-saT0~8iC}qm?eK3P~o=1<&e16%dsRZwI<^9Vp?1WAw6+~IHW=F zQ`P0}h>9=7eR_NuV*%UiO>$|LG%sVLzgx|UP#&PuF28a6GR~~HR)0CWXbZ>Wuv-Jp z;h`5d!!db81Z)S1tD#y-ff0RXlLVH`K4MhyCW!n{3G-)0A$Jbq+6$>7KiZNb%D@iV zs6SV6Zcv>xmIwcOFr5NmV)n7^(?$xvaVF&^8!dGy50+cqQ{Y6~TOj zza*4i^0clx=?@vO>9)Q$m2k~94ZdXfvNx|sk3)djim@B%b@;NCU`S%CnFB9xRylSM zw(iV0gKRGoaL=$to2YXqljqZ$qxC`^O(0=>W*mKjfmsmWcLkg>n@hlmCG}m$bLj8Nx zF0uR|O)eVZucAwNQ%2cnhy5IF2~f_`YFi|?E+T9)qghoOLO_3G%Xraz5}}qyUa<}E z>7W3|)=*%W$t;<_NvUzK3N3)Z((mLTnEGslaNgzp7x`LZf%<*?Lrdc1th(| z{&RJURt#d@G$akV|DzoP*uhoGoz|b%p}c0;9>TCjk_H-2J9U}~{6k?ki?%*(+v!}7 zSnLky9(T2c6!PCOzqnsk8*N}(Lj5=8txrZC=VG;IP;fCM{;{W4bKe<2z6r|k9_%!a zX0^24|7I%k9q#@6ir!YCCupYI_ZyX0{tHV)5ERsE;rnD8 z25I@fU<{;@n%f&8k4N5{fU^g=30+i#|KqkhVWha+n>(UeW{`CEWWFT<15Fp6lNm zMP0H7<@gusx@SFwv6n|Cm}_z01l8`iBN~0()ehVCNZ%PeW960y{`h~@E&Rb3%+SJ1 z{~0j2`6}9+N)MfX)6qGIca-i7h)};2=Mr?bwOuufru;rJ(PZo3_yX6AgBh?@vWzU5 zNF<}g-CH@JLVe~?@8*CgGz1VCa%!6w=bzAkeSw3WzE$t%vJ(FSZOqG%Ux(nMd9Q)h zjFXx~Bs6UcuVh-vuX6QDvB*$?+uG)!xyv-q3q?US+H{aP!L1$kRyHV9!x5+`GmVCH zYHj?Ao<((itI>h$gUr~`CxHC7+&PXH6CKW2%wHBczs?q6rkc(h_e@uJCI<}(D@i`~ z&0}Q+^j>Xrnx{hK(FFx?&}^#wtOAu-@?qY#?z>t#+erGOc1LR{@GLKNcT*t{^zWA- zvo@_S&xI!}(u7ff@)?sMt_bnh6P&U}B4R=lMlTN=6NR{Q{rLEag>-;b;nn(bKqfb2 zWDhxgRqLr+?nv|Wnm@vIC9HKez+3hPH5=C{0tm^)KLoJTT74k zx4dyD~KZO9F2jbvRZpr#a zIq0&(ZDuPmO}e|pTXs?Xmb#nTo8{8vmD}ecKiaxtDA?M&>W`m@bf(7XXM96A;PUr? zuUxWNEo^b$eYzp(oQDXj6ZDQ=!kQ<^5(h6szl1j2XM^aa0n;~Gb}1FEyluxXlBpeg zhm2UgI&mhNH84Xa3CZA?52o_XOsnkrR?d=v_n2Qw8e^Na5g>0NHn6UT!nqWV25VH- zHzT@gtwP$plZSj9ykXShi97xg->x`eo&pKaRQhbSH@@$}NwBW&vl;v+3@h9q;44p5 zR+<|?c}yxv@yIaAfgMM|Ej`+UP6jyQ-EaAwBY{jf*n&Hm81~$rmCn^{pf0p+V zOL>Ty%T^U={gLU?Z9gae>wP_4&mUhhiTAF|?H*OK+%ZV#-r71DAdTUJ^7_qA!6N{k zS;PK&1McpaEoyOf6|AqkkQqFHtNCiCV-SF6nJrbSzrk(B`m?AB&w2&)~lC17Kx-di_A>z^VX^_qX+sTP9BA zSK9EoMog#=L()|=i&5Q5l?)A^_hp>fj}U?}k!exX+{UQ_Jk%^MHRwn}hQ1%O&i^C` z-43lBmgE`Ir>mYL9|l0e9oC2kRf=e@?AC&%!tXD)H_b4~1e4yuKf=&N5Wm1M>r(+U zALhy7DQtjbl`xn7tDi0*t4k>#xsC7FQbRpvH-@5zBt4HkOhKWFWUuFCl5xDa@>UlM z3*;4sa<19`cv!cqI)nCceLV zOECI_%7fgMll-SqlbgNzAnw(2-OS>Ni|yGYUvP2i?5`8dKgMnJ0fe(+F)!Pyyj3?6 z#~p-6XAOao$MOfBCZ6ako0rxrgxu$&qLE&sy)Rs^GB(~8`rt~$70k_mP>Jl<9-j0| zEqJFg2eh&$-e<;iaQf8Zdv`Mb?(L3)9{u#6`Dqg~MVk}oZ5`0ZI|G91pvASbOUq(R zjy|`Fpqy`?nhhGE?`X+L4*67`DiNM{jP~e)bxZV+kbyfq@J7!r@xo(vu*Hh&*AB0l zhm!B(^9~s|N~L(43dNVR(#W@s?h<>%m+A>>W^(NBP4z)TDPs+_BERJ6KE7xuI(;;v z3`a^M<1NNYKU!`G3wPw`T@jjCX^>3Ipr3!}mBe0fJIOrajlJ0O@JffM*bJd*Xa!cM zTCj`d0zi{v+p~POUNjdm9aoz|0u?R-G}UTulBzVqpt#L8hU)ztM?)ofTRHV2w3Fwo z=wJT0Qpl&;c!AZT8y|9vf4?bj{@&e8rG>x0oR`J+x7zCVj#!0Er$mLSErE~k>_4zr zy`7SldhX=xhhzKAVSj2e#Z27x@p`!1>_s5(scGY zoVqe?r)$M0?hdPQ@b(-=KJh+KcRW8i^fAb!j-QR*exp+rc#hwyOK&&5HlVz2-++8l z-La0`(eF>5v;awDv(`iP!`w!U0(Wr3n>v{^{JYHBbUsf zj!RZ-F;nz6eSstMnM3`yzZa1ylVVKMd$pcZ2RJi=O=U^ZVKH?@Tp&^=?7FkDrb;qs z2Hdf6HI7RMd~MV60{9I88ssch`TNH1SW|WWs$Phg+!C_JS$DspoI&|dx%%v7w#?1@lJ4mSY9^n5Mq z$?HbiCc06aKPxYhDnr*0!Quo%VOV=5P0Kq$PT&8HDnzv~LuNPse4<28_f_Ov*_Wr; z><@_cyO4?qwWC?4y7OP(lgztADcP?!X@gWBC$a<82Kv{=UY7A^0Cq+WvzE{k(;or>-r!3V9u zTg7Zaw9)c693x8znqr6ts_R=8-{`zhR)avhP6X$FEN%d<-B7h~cZ0(2+uI*)E#pSQ zh#~o^S{{mHa@9Jzib%z!l#nh8ENC_muw2ur|7N?w z$xP_|RMiWgsA+&+Qf|NJbgPdKpc9|JNzO4%0(quk9p~Snz49byQ9Rvh6yEf~`qD6^ zO~%n`$uG#RKX>M31?GH-pvi<2WM zYSO3*|u?46c(ph>+CpQ z&3W2NP)0H~hBfYbmfyf8;)E`RWo#VOIWD`;RfZYyU6Nk+ zDJ&-&6DgL5i+P|-;4m*?s=-ws__vIN(~wq^ zJY%B*%tc%r3qneheoP3JrS&D0kqx!aKR<9dTSDp9;EaZc|5vEN5#AiR=`%7=@ed=T zsW78GeR?iw?<~)JHbhA$3}JLQQde>sk0sLij&I>2VybI}Q^|U^GsIOl=uifYxKw&u zBsmocSA#|P&kv{BJb(1EP}%u1;hUZ6V3}9C%nP^9tb&hk-FV?(t{=Nv3IT>Qc$Bq0 z&0Z}>*0pL)ZZ_~rgW5a&WV4ER_9)B;8a_UcrLxeta7xopwQL<>77gpBgPQ>x18*Tp zpz1%2SNwlFnwW(meyKF;j?SUwZsx^H82qtI!J9=RAlqkG#Vmo)Kc^L9Uh{@F^-gtM zPx;z$sDxH7x=+~BlRR^lmEdG2UdO-VcH*Sul6nXrcvRGJK+{=AY7PtQyr11O05x6pF|ACaXLF$@r z9t$SxgT?oXj3Q0v+^O(VR{!*rTP$9E|IO&G*^G zZ}L`khCcr_pv<~Uy<;pciK+koSP%1Wr!}k=jmi9F3eYGq>e4z^nzuT?-e$e@epWLt zAE&B;qGO0wYE9n;xaiI%BbgH3jN1_Us!zY*xH9`LV<`R~%*0aY1wax#EOz1SEi*3* z-5|GMB0}xJmXSQS#3(s!=NQYe$9dGe22?MLeDb(@Z6BTp*OD3iEMx_a>omxkLNNyD zNEkjaSb|pahJ-uR&Sl7zqa#yC!0ZZ!Lk;N?4O#UM4@#j#!*?F~vkOX`){58Zo#A(} z)sjQ~edTvYL+YxMmQeb5hQa{J?Fv*!E57oil_fZ#qa-WSv8ac-ilbXR=4cSKJn-yo z_IV>zRhhvz8uK32gQ7~e^51K>3if091qI z1qG2erJK*?E`TdZcz;osVeKw`%ABI`Un_FxecSHaH%ls+(A?;(;*kk>(%@1j&;P;^ z{MHNMHNHLW=*8q2sl=|3JXD-?B4!y=*+;2l1mQKx_PV56*UD^Y##Wpn|CvUs^jXeu z!pxY#2CnBc*GO$OA_--x3a5H!+bUVzAM7kO%BDW8EE|s%9NfAy2*w<6bOK422Ux`K zoH8MX;c0IYEKiGw4rE5^%?Fv>A)99_O>)aFjubJimxEsV&r>1J&m-EtmLCqOp+qBVCiWNbXG z*94vX6MwCefj1p8`E3(8xApBGA@I^K@+;S=IuQ*UT}MY4bU5$TLfV(OXU$JWl-0h+ zfdAWaOu5A-#90H&byoN`2*dea_c~Y8^9)l?M?eiX?t`ME-$7=RgABeN4v z*F6Lu^Sq+c8$CfTEDm1#1fFA!eh7B{BN9DPc6N@@ND>KIs& zTxn#K5lwJ{Ps-kQPB10m0`iA|7qI4C<{Xa8^EXkIr^mf}Ja-1HRgu=&8L+~J>e0*0@kQ_@Zu0_9Hh9V=Mx@u~+r~jP9 zJ;YlC(h>vmWf(~guD;k_kY9sJM-)!hX%IJUJoIMM;26xj56kenov(AtD}VJkl9I80sgw@Em22HWUB@R>v7$iK zCKHcf&76KZvZruwB@=cZ9rB%L2b6O}YQ{$DU))VXJlZ=0eG7$%m)O z3h^F(lq1}haM7jlQiw16*W}Co3h0;^7jJ>Gc^CvAIE*} z3=`&~XSQnC;zGl-VLD$;Eu~toMGeIC=c$nkO1D9@d$8vSlB}CQN2LV5jO5Xg&1@0o zUy*UVL)(16HsWHG(#H>TA8)j`!UJRGBjESnQAWXa)`1ThDmNyvl1gtYa&hNE`HeO% zC~T&)-C6b&6C)2;z+;8DGxCo*c1Qr>byEXET4N}qk$|&psO&hJm^BH~dsev9M(G^? z@7N=C;Xz@XQ%7H7pLJ_EGwn}iy^s9FSiL%!bc!bFa%<=NTbdSc`^ximn?W!Lc}2kk zh1K}c^wLNTFEaZ&(P6f6=ZV>r*3AJLhg0Pl)SWZ$ZuAsnhbegG#HI=AC&q>rm1vl)VB1T|{EAgk+|4B=z-Fc(wj!3dzJx)}4FUGy!lQqfc-roYK76nZB$= ztqC~d?my7QUg7Up+6jok(HORqq_=Qe$0Fos`Zfr5sc7N$MlVVtoJzVlvsV8RC`F@( z<9@GO(T#Qpm@OW2Q?)(i`9_n9k_KVIp0Ix_BO>yqQxSD6V_!_|RH-|sdz++B7wwo@ zOsN6xEjGGOT0~=x9qkb4t1TEhc)KkO<#ua%%A61?x$m;F7XBe2s)giV2G6xTiO+tt(_)!qmeHwosK>l+vq1T2pa4$++JE9~vfKUG!Z%IY+dzI; z&G%g}^{ndPl6ER#9jaG_nX1x$(q_xTkUF&UzI&k?07r-ZIV4W8iE_Kq1Ka{e1wB({ zq-(nC%lBeuBC+vm59TA$a?lT)i$!*psD^;B24tqpGVl=LbmDHdL6;GD&*YO}Ek!=6 z*pdey6nte>(lN$#uP7iDP|I6LH9-gNc)YbV-x zMmHmcQX%5!>5lrH`cKo}a}ep){;~~&bO+S3>;H`Wq?b`f?GBmdkA4l6m=&bO6e-R} z{o3&tA}KWmmj#Mts?W>QxMx6t&5~7NS~qlFK*cvHMjc7oEhXGZ}pSx4(%b2Pyu#Ha&5YJsbt!G ziME-KYwH3$8$RrkukiOT#U=ZOP?-6pnKDQ8%538&Vfz^mtcAO~3)pIFKbd2Ea{dfbWMPd9~4nXZ9*1JmI=pFBj*mO;Xo z$4WocVHe^S zrf)ynAHSZF&H1pzW+1_p*#b>6c7__&D?$Y3d5g0d5A+zug;``N&KeFPmImWYou08? zG4#Bf*ZTQQvvFo$d8+I+iIuRnIO?_$Q=sD0!M=^M%nRKWU52KW>XRLLlV<5&$7ris z=bP}~8M1K{9^F3(=!Oe%8}t<1&5@rYt+h4JmZm+JeDS%(h^v@r_a}W8c|dTcunjKy zP;2mX&0!#QXqgO-m5#$aYU?8waMd*ksb^>a7U*5+RWbG3Rv;k&OjyOBAKdp^F$g=q z@n&W8Go`Asn2%bJX14JTqde5K+Z-pL2-F#Co!*ne;`Aqa;Hss;#tNhZ#h)iB8zaqH z9uf6Lh91Q`A-teLh8{SncPz-ASylf?cPxXU5Al%c z(mi!k$tsB85Yp&C0E2#nWRSBUA%`LI{bfj{H?Ai*O#8&s7X zXEpZo%-av0<}lCu`cYl2Fgi4U%FfanqHS;@4X2VeY!bo49uo2xw5_v%E6btef&Ssz ziv(@<<}r3mmOK+4?aYI$!MTri8JkW4SSQ>mGvRA%ofahGP^g#*GqRUY`0`A?MX;(s zM{(jZFK1>fwbHTr@-8F?0kee2biQRY==`O?w^Ys@Ou!#zx^y=f-LRbTY;kSdKHU7N zUVYE7=VqRFBb~Q-H(r7tV%%rhc+q6>^G@t&=-a>4+RW1VA}28fMf0d$&#jC%hd8k} zqCl-9NFQf|-0#$R5X-`1YBv^T4U2IVixv?}dG&^EpL(DKy4xs|F=wjbgm0uXeImB zCd+LYd;sBJ1GZs%D2v;Nl!5f(K^%so}{`TDDPQR1kZZe6umzyJU zbS+SzvaK~r3-tlmOW|i2|0J0|LgAJ)^$VNtKX6{~*{KH;)k571d)qL6OUS$UQH$7O zy8$ka@a`9fjCD6WU}`=iag*B~@=?C-A2VvWZX4TKux6b`_Py`xbeowzrU5&=&0319 zWkXEZGg|C9ujuLE%Uo7xXQ4u*rUNrxuQFxS-yQYb-Ilo7OgQ=89F3IzR3zSg z6aplZ+HZEu*S2<71Qf!YN#~^4-&zy)dM|E-mck$5{7^w1-9HrQf;yv0g%FV@_J0D2 z7`iqOn1OCL20|=tU>DSEb6?$*&bq*XN+}=oW*fe&A`;tEaZjUs? z1w*nl35m!^*A)@`*58|ZXz*~Ar7l}_xKj-D^l<}8IpoQ0*+m}FOyutr+(gN%Hz5jO*c6;;ZWx)J{$+nKVPFA1UhL>7os4qFHb(jf~CR_g!>w}`@L2jd1A|RXHm;W8 zC3jzw+Q5NqViAe1>s4`pU?9khRs1Egfu*qyMt{RcA)%MPs-u_B0`KlDl2$MX1B!=P zZu|?sy@tS@p_08Z(<;IDb}pyU>J}uZQ{rWs*LSNUfj~^d3=f-`%AMAD&BTkP9+>tl zDJ{}u*!ATNp}F+p{pc$*S{!-!8yfuR!xM6Uo0m^wqx=vhCrz#B7v`m#^=ckt*8$dv z`E`QG-*g}dNMoJPWq57IO?@`Q5N9Ks1oC1@+iHbgEfvq+=htG&(9&`xhD)(2AVoKk zvK&{~ofr^N)UXm_Ix$Vs*QBxWhzH~4bSgKH=b777OV)kBuG3xAV(p5T_xq>pV%@!v zh?Zjui0dTbraz=lc{X52_rMWkY>mnQKD{A4mhIu!e)e|SJ@!)oZiNuGW4`;{Iof865u zs@`w5ncG`l@@D4ugIj2M5AR0>$kHyxR+A%sKvhLrsL#V&S@mxe`ZJb|edDQ+X0^6> z-b&@hMQ**WnIVpu^i6Cx6`IXYs~jq)kHg!dGpOXi(0Srl>`K+MRhelty(V76IfvNG zX1xtXOaXaG z+_JxC!D;_E$BO*T0k8RrrmyO!W1P4C|s$hEQ0+WFU)2O7O5$4rfhu~pCx|yd(fvNq=g-nZAY95eVR9F(&|9-q5UPN zS{>Xsk05n6yexm={AEJDIUF*tAjjbRtK{HDzksUNtBN$j#?-U@4^aM4ez5a{@*6Q!`VCFyygzX>28W<`}oB-GRi~Zvhxj)8VWxR*4_k zo8Yz$Q6SxHMp_Fuc;gCEqbddbN`aHNk<{wfQ%3Mb`#s zh@8|YRQ5Zqw9z-0Oa1@VzBT(G&>+~9)qS*TPdZ&QDseNrLQG=2tmZ2CN$E90EBO z1M1Fnw(1D26KNCh#XvthAPhexc!yG-0*&V4JXc;EG7Z&hJLKPs?E%61DN}eb&ICZp zV1MD-Kiab(OqdsmH6vxj%)76T1`>?mR=w9vLs(@}B@=Z|*|SC1SuF=zfw13;*kBXR zI;-W7z)hy^$6`;D({)gW98vyY|E7rf(v?%Sro-i-kJ#+;PW6pDB)&D=o3eg;V9J>T zPp{&b%F5QXOh28Lng2Tt#?$j+swv~9Rjv#XXTuk=zatnC5bGLsYfs$%-!R#_3^ zHm^?{HAGgOB+nMM;=Ow(NXfF&;+TQ}U4ncZ0xiP)$}mE_aamlO`H#!%ULq1(+AzuN zxEc1PQ@n9KN|-ZF5DS7Pa!>->wEbz@Mq>*S%{amYvgWv<<;upnYts6;dLy9ubq~pK z(A*TJ0Oq$kT~2A&Uz?{USIK*!xQKq{zfJv$cQpKa4yFU_lr%?#Xx!YXou9%-YC$C} z>mlAVQPiHbu8c8re$Rf?7OwU2PqGzZY+MMTO7G-=lI6-S!A5h*F@dD4`h-UqnMZI@pIY_a*MiltEBA8FV7B3I{NkiSb2BJ-r!-~ zAa)%6M90KWk*6MM8giwzs>u6hdCMxzmPmpjr)Tufr(+G=E@oLp`(Lz55p|D!5Xi;2 zYeCn|FY+;Lml-I3GL zOZThgFhFV~DIC>jWJ_pY{`lCPV?w>TGiR8H@9P$6qclaw%ht>fW_V-*k~UkLD$M%u zV5X#C{iizAR9$8JFT;(lEOha%O>@Sg7=4h(ErcYT8ZTn%pu_Qv52g1`RNIb41gGTf z*4-UZSurrtP;BgVsxr1>9R3|_YFhVDGrcYx!W)@+6~9BXwpHkOAMhQkbr+rOw+>lg zy+QGlxgi_6UkUrj!*EKCyf)I+P;Bl(JW;=>gUhd3Xvhp&SW>*|U zxtX!{I!3Ug-`a)o&E*nfzQGQwFsLVQCFOd1G)dY}I>|muR!b5}ql%kAz%2B~GG(t< z8U_*&SLZ39Sl(aucSF;dkVL_-cU=vNlxAnWQdmLLK`4JA2Bx42Fb6A?DTN~f-^7=z zKQK(Q{tx;OYNKMSzL8ypuX{H(jAw{R-Bih?tqILkW3Bo9->B3z9>{|v3kVA1u3jEO zCgSHu_aoWD>i@uitR0)fc_o;PT)CSJw&Dhf(rq7qbDR|$f48|mi$QFoLJav#p2ESX z!2%#=M}EV4Tu$M(lScKTe05z*ETU%u`4>h77R$Hz(th2J<^~qOY6AAg@>)g8(Jo}f zjN+wDmguRBuJ)e3;|4$s(vcGZ73&m-j%<{qQ@P4&a$|h05LL8hW5!8UWsK8bEpTaUUL-8-fIjtMMF87E4QltC29njoaCzbY-pMI{5^1kKt{Vg_~Lj>J6n8 zq6oa+wF>DiNJez1n{cu)(U~)vMT;?}fEp-EJ=TrXz5C9!jp;8kqpfF+G$j7~*GfgA zBfSVBBgak5g3*mC<5jkell_OqB`pxSMI!&{FDF|BJ}-^5eZEy}pyp7AH?+ss1AB@| zNToxlF4Cw%C(U2Qbv;E1f%-AuupEj|Iy9~Pi=eJ&K~8N{kzKec5vJYYkaIA4feE7& zuTHRgRj7gAWb8aCU}Y-2Pgke#@{AlitWB$uw5`rj3UoWtfFS+N*R#YPcMBbEBV zrJs2}aO+1LikAVw*VBBK0zbO@W4LOEVK^Z~aJV4KBP$nZD`Wn-%i=HB4)4Dq(@;s*)(=k>TvXN>EuGC3UBBJ{8)!N^TjJUfy zgfJTPrh@scK%1x$wt6^g>*W?0t_WMj|8C0nDo zx1MrXPQH7%-_u3uX9T$u78=KJFa1a0^xS^jpIU+So1nRl1wvSJ4WVHJ1o~cPc_jFq zC~$i-clzb0+hP^MT%A9BVt0M{f%u|;d2w_?v|)BdA@vsVzS zbesI2w(fsnZ+_b}@f?cyXQtlABa@JB7TbRkp0-~RQ3;fd+{Sh!|7FfxuTkTytY?ye zyp3FcD@1MfrHH8oyVhI{H7WBcf70DrJ8%1lB~r*<8BiZYZG2A6|0`Sg|IZ!%zn+@6 bKOl4E-xAHx7ehYNo*|@vC`i/dev/null; then + csudo="sudo " + csudouser="sudo -u ${USER} " +fi service_mod=2 os_type=0 if [ "$osType" != "Darwin" ]; then - if command -v sudo >/dev/null; then - csudo="sudo " - fi initd_mod=0 if pidof systemd &>/dev/null; then service_mod=0 @@ -142,28 +139,16 @@ function kill_taosd() { function install_main_path() { #create install main dir and all sub dir - if [ "$osType" != "Darwin" ]; then - ${csudo}rm -rf ${install_main_dir} || : - ${csudo}mkdir -p ${install_main_dir} - ${csudo}mkdir -p ${install_main_dir}/cfg - ${csudo}mkdir -p ${install_main_dir}/bin - # ${csudo}mkdir -p ${install_main_dir}/connector - ${csudo}mkdir -p ${install_main_dir}/driver - ${csudo}mkdir -p ${install_main_dir}/examples - ${csudo}mkdir -p ${install_main_dir}/include - ${csudo}mkdir -p ${install_main_dir}/share - # ${csudo}mkdir -p ${install_main_dir}/init.d - else - ${csudo}rm -rf ${install_main_dir} || ${csudo}rm -rf ${install_main_2_dir} || : - ${csudo}mkdir -p ${install_main_dir} || ${csudo}mkdir -p ${install_main_2_dir} - ${csudo}mkdir -p ${install_main_dir}/cfg || ${csudo}mkdir -p ${install_main_2_dir}/cfg - ${csudo}mkdir -p ${install_main_dir}/bin || ${csudo}mkdir -p ${install_main_2_dir}/bin - # ${csudo}mkdir -p ${install_main_dir}/connector || ${csudo}mkdir -p ${install_main_2_dir}/connector - ${csudo}mkdir -p ${install_main_dir}/driver || ${csudo}mkdir -p ${install_main_2_dir}/driver - ${csudo}mkdir -p ${install_main_dir}/examples || ${csudo}mkdir -p ${install_main_2_dir}/examples - ${csudo}mkdir -p ${install_main_dir}/include || ${csudo}mkdir -p ${install_main_2_dir}/include - ${csudo}mkdir -p ${install_main_dir}/share || ${csudo}mkdir -p ${install_main_2_dir}/share - fi + ${csudo}rm -rf ${install_main_dir} || : + ${csudo}mkdir -p ${install_main_dir} + ${csudo}mkdir -p ${install_main_dir}/cfg + ${csudo}mkdir -p ${install_main_dir}/bin + # ${csudo}mkdir -p ${install_main_dir}/connector + ${csudo}mkdir -p ${install_main_dir}/driver + ${csudo}mkdir -p ${install_main_dir}/examples + ${csudo}mkdir -p ${install_main_dir}/include + ${csudo}mkdir -p ${install_main_dir}/share + # ${csudo}mkdir -p ${install_main_dir}/init.d } function install_bin() { @@ -175,11 +160,11 @@ function install_bin() { ${csudo}rm -f ${bin_link_dir}/taosdemo || : ${csudo}rm -f ${bin_link_dir}/taosdump || : ${csudo}rm -f ${bin_link_dir}/taosx || : + ${csudo}rm -f ${bin_link_dir}/${uninstallScript} || : if [ "$osType" != "Darwin" ]; then ${csudo}rm -f ${bin_link_dir}/perfMonitor || : ${csudo}rm -f ${bin_link_dir}/set_core || : - ${csudo}rm -f ${bin_link_dir}/${uninstallScript} || : ${csudo}cp -r ${binary_dir}/build/bin/${clientName} ${install_main_dir}/bin || : [ -f ${binary_dir}/build/bin/taosBenchmark ] && ${csudo}cp -r ${binary_dir}/build/bin/taosBenchmark ${install_main_dir}/bin || : @@ -209,18 +194,26 @@ function install_bin() { [ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || : else - ${csudo}cp -r ${binary_dir}/build/bin/* ${install_main_dir}/bin || ${csudo}cp -r ${binary_dir}/build/bin/* ${install_main_2_dir}/bin || : - ${csudo}cp -r ${script_dir}/taosd-dump-cfg.gdb ${install_main_dir}/bin || ${csudo}cp -r ${script_dir}/taosd-dump-cfg.gdb ${install_main_2_dir} || : - ${csudo}cp -r ${script_dir}/remove_client.sh ${install_main_dir}/bin || ${csudo}cp -r ${script_dir}/remove_client.sh ${install_main_2_dir}/bin || : - ${csudo}chmod 0555 ${install_main_dir}/bin/* || ${csudo}chmod 0555 ${install_main_2_dir}/bin/* + ${csudo}cp -r ${binary_dir}/build/bin/${clientName} ${install_main_dir}/bin || : + [ -f ${binary_dir}/build/bin/taosBenchmark ] && ${csudo}cp -r ${binary_dir}/build/bin/taosBenchmark ${install_main_dir}/bin || : + [ -f ${install_main_dir}/bin/taosBenchmark ] && ${csudo}ln -sf ${install_main_dir}/bin/taosBenchmark ${install_main_dir}/bin/taosdemo || : + [ -f ${binary_dir}/build/bin/taosdump ] && ${csudo}cp -r ${binary_dir}/build/bin/taosdump ${install_main_dir}/bin || : + [ -f ${binary_dir}/build/bin/taosadapter ] && ${csudo}cp -r ${binary_dir}/build/bin/taosadapter ${install_main_dir}/bin || : + [ -f ${binary_dir}/build/bin/udfd ] && ${csudo}cp -r ${binary_dir}/build/bin/udfd ${install_main_dir}/bin || : + [ -f ${binary_dir}/build/bin/taosx ] && ${csudo}cp -r ${binary_dir}/build/bin/taosx ${install_main_dir}/bin || : + ${csudo}cp -r ${binary_dir}/build/bin/${serverName} ${install_main_dir}/bin || : + + ${csudo}cp -r ${script_dir}/remove.sh ${install_main_dir}/bin || : + ${csudo}chmod 0555 ${install_main_dir}/bin/* #Make link - [ -x ${install_main_dir}/bin/${clientName} ] || [ -x ${install_main_2_dir}/bin/${clientName} ] && ${csudo}ln -s ${install_main_dir}/bin/${clientName} ${bin_link_dir}/${clientName} || ${csudo}ln -s ${install_main_2_dir}/bin/${clientName} || : - [ -x ${install_main_dir}/bin/${serverName} ] || [ -x ${install_main_2_dir}/bin/${serverName} ] && ${csudo}ln -s ${install_main_dir}/bin/${serverName} ${bin_link_dir}/${serverName} || ${csudo}ln -s ${install_main_2_dir}/bin/${serverName} || : - [ -x ${install_main_dir}/bin/taosadapter ] || [ -x ${install_main_2_dir}/bin/taosadapter ] && ${csudo}ln -s ${install_main_dir}/bin/taosadapter ${bin_link_dir}/taosadapter || ${csudo}ln -s ${install_main_2_dir}/bin/taosadapter || : - [ -x ${install_main_dir}/bin/udfd ] || [ -x ${install_main_2_dir}/bin/udfd ] && ${csudo}ln -s ${install_main_dir}/bin/udfd ${bin_link_dir}/udfd || ${csudo}ln -s ${install_main_2_dir}/bin/udfd || : - [ -x ${install_main_dir}/bin/taosdump ] || [ -x ${install_main_2_dir}/bin/taosdump ] && ${csudo}ln -s ${install_main_dir}/bin/taosdump ${bin_link_dir}/taosdump || ln -s ${install_main_2_dir}/bin/taosdump ${bin_link_dir}/taosdump || : - [ -x ${install_main_dir}/bin/taosdemo ] || [ -x ${install_main_2_dir}/bin/taosdemo ] && ${csudo}ln -s ${install_main_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || ln -s ${install_main_2_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || : - [ -x ${install_main_dir}/bin/taosx ] || [ -x ${install_main_2_dir}/bin/taosx ] && ${csudo}ln -s ${install_main_dir}/bin/taosx ${bin_link_dir}/taosx || ln -s ${install_main_2_dir}/bin/taosx ${bin_link_dir}/taosx || : + [ -x ${install_main_dir}/bin/${clientName} ] && ${csudo}ln -s ${install_main_dir}/bin/${clientName} ${bin_link_dir}/${clientName} || : + [ -x ${install_main_dir}/bin/${serverName} ] && ${csudo}ln -s ${install_main_dir}/bin/${serverName} ${bin_link_dir}/${serverName} || : + [ -x ${install_main_dir}/bin/taosadapter ] && ${csudo}ln -s ${install_main_dir}/bin/taosadapter ${bin_link_dir}/taosadapter || : + [ -x ${install_main_dir}/bin/udfd ] && ${csudo}ln -s ${install_main_dir}/bin/udfd ${bin_link_dir}/udfd || : + [ -x ${install_main_dir}/bin/taosdump ] && ${csudo}ln -s ${install_main_dir}/bin/taosdump ${bin_link_dir}/taosdump || : + [ -f ${install_main_dir}/bin/taosBenchmark ] && ${csudo}ln -sf ${install_main_dir}/bin/taosBenchmark ${install_main_dir}/bin/taosdemo || : + [ -x ${install_main_dir}/bin/taosx ] && ${csudo}ln -s ${install_main_dir}/bin/taosx ${bin_link_dir}/taosx || : + [ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || : fi } @@ -331,28 +324,20 @@ function install_lib() { fi else ${csudo}cp -Rf ${binary_dir}/build/lib/libtaos.${verNumber}.dylib \ - ${install_main_dir}/driver || - ${csudo}cp -Rf ${binary_dir}/build/lib/libtaos.${verNumber}.dylib \ - ${install_main_2_dir}/driver && - ${csudo}chmod 777 ${install_main_dir}/driver/* || - ${csudo}chmod 777 ${install_main_2_dir}/driver/* - - ${csudo}ln -sf ${install_main_dir}/driver/libtaos.* \ - ${install_main_dir}/driver/libtaos.1.dylib || - ${csudo}ln -sf ${install_main_2_dir}/driver/libtaos.* \ - ${install_main_2_dir}/driver/libtaos.1.dylib || : - - ${csudo}ln -sf ${install_main_dir}/driver/libtaos.1.dylib \ - ${install_main_dir}/driver/libtaos.dylib || - ${csudo}ln -sf ${install_main_2_dir}/driver/libtaos.1.dylib \ - ${install_main_2_dir}/driver/libtaos.dylib || : + ${install_main_dir}/driver && ${csudo}chmod 777 ${install_main_dir}/driver/* ${csudo}ln -sf ${install_main_dir}/driver/libtaos.${verNumber}.dylib \ - ${lib_link_dir}/libtaos.1.dylib || - ${csudo}ln -sf ${install_main_2_dir}/driver/libtaos.${verNumber}.dylib \ - ${lib_link_dir}/libtaos.1.dylib || : + ${lib_link_dir}/libtaos.1.dylib || : ${csudo}ln -sf ${lib_link_dir}/libtaos.1.dylib ${lib_link_dir}/libtaos.dylib || : + + if [ -f ${binary_dir}/build/lib/libtaosws.dylib ]; then + ${csudo}cp ${binary_dir}/build/lib/libtaosws.dylib \ + ${install_main_dir}/driver && + ${csudo}chmod 777 ${install_main_dir}/driver/libtaosws.dylib ||: + + ${csudo}ln -sf ${install_main_dir}/driver/libtaosws.dylib ${lib_link_dir}/libtaosws.dylib || : + fi fi install_jemalloc @@ -365,37 +350,30 @@ function install_lib() { } function install_header() { + ${csudo}rm -f ${inc_link_dir}/taos.h ${inc_link_dir}/taosdef.h ${inc_link_dir}/taoserror.h ${inc_link_dir}/taosudf.h || : + [ -f ${inc_link_dir}/taosws.h ] && ${csudo}rm -f ${inc_link_dir}/taosws.h ||: + ${csudo}cp -f ${source_dir}/include/client/taos.h ${source_dir}/include/common/taosdef.h ${source_dir}/include/util/taoserror.h ${source_dir}/include/libs/function/taosudf.h \ + ${install_main_dir}/include && ${csudo}chmod 644 ${install_main_dir}/include/* - if [ "$osType" != "Darwin" ]; then - ${csudo}rm -f ${inc_link_dir}/taos.h ${inc_link_dir}/taosdef.h ${inc_link_dir}/taoserror.h ${inc_link_dir}/taosudf.h || : - [ -f ${inc_link_dir}/taosws.h ] && ${csudo}rm -f ${inc_link_dir}/taosws.h ||: - ${csudo}cp -f ${source_dir}/include/client/taos.h ${source_dir}/include/common/taosdef.h ${source_dir}/include/util/taoserror.h ${source_dir}/include/libs/function/taosudf.h \ - ${install_main_dir}/include && ${csudo}chmod 644 ${install_main_dir}/include/* - - if [ -f ${binary_dir}/build/include/taosws.h ]; then - ${csudo}cp -f ${binary_dir}/build/include/taosws.h ${install_main_dir}/include && ${csudo}chmod 644 ${install_main_dir}/include/taosws.h ||: - ${csudo}ln -sf ${install_main_dir}/include/taosws.h ${inc_link_dir}/taosws.h ||: - fi - - ${csudo}ln -s ${install_main_dir}/include/taos.h ${inc_link_dir}/taos.h - ${csudo}ln -s ${install_main_dir}/include/taosdef.h ${inc_link_dir}/taosdef.h - ${csudo}ln -s ${install_main_dir}/include/taoserror.h ${inc_link_dir}/taoserror.h - ${csudo}ln -s ${install_main_dir}/include/taosudf.h ${inc_link_dir}/taosudf.h - - else - ${csudo}cp -f ${source_dir}/include/client/taos.h ${source_dir}/include/common/taosdef.h ${source_dir}/include/util/taoserror.h ${source_dir}/include/libs/function/taosudf.h \ - ${install_main_dir}/include || - ${csudo}cp -f ${source_dir}/include/client/taos.h ${source_dir}/include/common/taosdef.h ${source_dir}/include/util/taoserror.h ${source_dir}/include/libs/function/taosudf.h \ - ${install_main_2_dir}/include && - ${csudo}chmod 644 ${install_main_dir}/include/* || ${csudo}chmod 644 ${install_main_2_dir}/include/* + if [ -f ${binary_dir}/build/include/taosws.h ]; then + ${csudo}cp -f ${binary_dir}/build/include/taosws.h ${install_main_dir}/include && ${csudo}chmod 644 ${install_main_dir}/include/taosws.h ||: + ${csudo}ln -sf ${install_main_dir}/include/taosws.h ${inc_link_dir}/taosws.h ||: fi + + ${csudo}ln -s ${install_main_dir}/include/taos.h ${inc_link_dir}/taos.h + ${csudo}ln -s ${install_main_dir}/include/taosdef.h ${inc_link_dir}/taosdef.h + ${csudo}ln -s ${install_main_dir}/include/taoserror.h ${inc_link_dir}/taoserror.h + ${csudo}ln -s ${install_main_dir}/include/taosudf.h ${inc_link_dir}/taosudf.h + + ${csudo}chmod 644 ${install_main_dir}/include/* } function install_config() { if [ ! -f ${cfg_install_dir}/${configFile} ]; then ${csudo}mkdir -p ${cfg_install_dir} [ -f ${script_dir}/../cfg/${configFile} ] && - ${csudo}cp ${script_dir}/../cfg/${configFile} ${cfg_install_dir} + ${csudo}cp ${script_dir}/../cfg/${configFile} ${cfg_install_dir} && + ${csudo}cp ${script_dir}/../cfg/${configFile} ${cfg_dir} ${csudo}chmod 644 ${cfg_install_dir}/${configFile} ${csudo}cp -f ${script_dir}/../cfg/${configFile} \ ${cfg_install_dir}/${configFile}.${verNumber} @@ -404,6 +382,7 @@ function install_config() { else ${csudo}cp -f ${script_dir}/../cfg/${configFile} \ ${cfg_install_dir}/${configFile}.${verNumber} + ${csudo}cp -f ${script_dir}/../cfg/${configFile} ${cfg_dir} fi } @@ -411,7 +390,8 @@ function install_taosadapter_config() { if [ ! -f "${cfg_install_dir}/taosadapter.toml" ]; then ${csudo}mkdir -p ${cfg_install_dir} || : [ -f ${binary_dir}/test/cfg/taosadapter.toml ] && - ${csudo}cp ${binary_dir}/test/cfg/taosadapter.toml ${cfg_install_dir} || : + ${csudo}cp ${binary_dir}/test/cfg/taosadapter.toml ${cfg_install_dir} && + ${csudo}cp ${binary_dir}/test/cfg/taosadapter.toml ${cfg_dir} || : [ -f ${cfg_install_dir}/taosadapter.toml ] && ${csudo}chmod 644 ${cfg_install_dir}/taosadapter.toml || : [ -f ${binary_dir}/test/cfg/taosadapter.toml ] && @@ -424,6 +404,7 @@ function install_taosadapter_config() { if [ -f "${binary_dir}/test/cfg/taosadapter.toml" ]; then ${csudo}cp -f ${binary_dir}/test/cfg/taosadapter.toml \ ${cfg_install_dir}/taosadapter.toml.${verNumber} || : + ${csudo}cp -f ${binary_dir}/test/cfg/taosadapter.toml ${cfg_dir} || : fi fi } @@ -431,20 +412,12 @@ function install_taosadapter_config() { function install_log() { ${csudo}rm -rf ${log_dir} || : ${csudo}mkdir -p ${log_dir} && ${csudo}chmod 777 ${log_dir} - if [ "$osType" != "Darwin" ]; then - ${csudo}ln -s ${log_dir} ${install_main_dir}/log - else - ${csudo}ln -s ${log_dir} ${install_main_dir}/log || ${csudo}ln -s ${log_dir} ${install_main_2_dir}/log - fi + ${csudo}ln -s ${log_dir} ${install_main_dir}/log } function install_data() { - ${csudo}mkdir -p ${data_dir} - if [ "$osType" != "Darwin" ]; then - ${csudo}ln -s ${data_dir} ${install_main_dir}/data - else - ${csudo}ln -s ${data_dir} ${install_main_dir}/data || ${csudo}ln -s ${data_dir} ${install_main_2_dir}/data - fi + ${csudo}mkdir -p ${data_dir} && ${csudo}chmod 777 ${data_dir} + ${csudo}ln -s ${data_dir} ${install_main_dir}/data } function install_connector() { @@ -453,31 +426,17 @@ function install_connector() { else echo "WARNING: go connector not found, please check if want to use it!" fi - if [ "$osType" != "Darwin" ]; then - ${csudo}cp -rf ${source_dir}/src/connector/python ${install_main_dir}/connector || : - ${csudo}cp ${binary_dir}/build/lib/*.jar ${install_main_dir}/connector &>/dev/null && ${csudo}chmod 777 ${install_main_dir}/connector/*.jar || echo &>/dev/null || : - else - ${csudo}cp -rf ${source_dir}/src/connector/python ${install_main_dir}/connector || ${csudo}cp -rf ${source_dir}/src/connector/python ${install_main_2_dir}/connector || : - ${csudo}cp ${binary_dir}/build/lib/*.jar ${install_main_dir}/connector &>/dev/null && ${csudo}chmod 777 ${install_main_dir}/connector/*.jar || echo &>/dev/null || : - ${csudo}cp ${binary_dir}/build/lib/*.jar ${install_main_2_dir}/connector &>/dev/null && ${csudo}chmod 777 ${install_main_2_dir}/connector/*.jar || echo &>/dev/null || : - fi + ${csudo}cp -rf ${source_dir}/src/connector/python ${install_main_dir}/connector || : + ${csudo}cp ${binary_dir}/build/lib/*.jar ${install_main_dir}/connector &>/dev/null && ${csudo}chmod 777 ${install_main_dir}/connector/*.jar || echo &>/dev/null || : } function install_examples() { - if [ "$osType" != "Darwin" ]; then - ${csudo}cp -rf ${source_dir}/examples/* ${install_main_dir}/examples || : - else - ${csudo}cp -rf ${source_dir}/examples/* ${install_main_dir}/examples || ${csudo}cp -rf ${source_dir}/examples/* ${install_main_2_dir}/examples || : - fi + ${csudo}cp -rf ${source_dir}/examples/* ${install_main_dir}/examples || : } function install_web() { if [ -d "${binary_dir}/build/share" ]; then - if [ "$osType" != "Darwin" ]; then - ${csudo}cp -rf ${binary_dir}/build/share/* ${install_main_dir}/share || : - else - ${csudo}cp -rf ${binary_dir}/build/share/* ${install_main_dir}/share || ${csudo}cp -rf ${binary_dir}/build/share/* ${install_main_2_dir}/share || : - fi + ${csudo}cp -rf ${binary_dir}/build/share/* ${install_main_dir}/share || : fi } @@ -575,13 +534,36 @@ function install_taosadapter_service() { fi } +function install_service_on_launchctl() { + ${csudouser}launchctl unload -w /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || : + ${csudo}cp ${script_dir}/com.taosdata.taosd.plist /Library/LaunchDaemons/com.taosdata.taosd.plist + ${csudouser}launchctl load -w /Library/LaunchDaemons/com.taosdata.taosd.plist || : +} + function install_service() { - if ((${service_mod} == 0)); then - install_service_on_systemd - elif ((${service_mod} == 1)); then - install_service_on_sysvinit + if [ "$osType" != "Darwin" ]; then + if ((${service_mod} == 0)); then + install_service_on_systemd + elif ((${service_mod} == 1)); then + install_service_on_sysvinit + else + kill_taosd + fi else - kill_taosd + install_service_on_launchctl + fi +} +function install_app() { + if [ "$osType" = "Darwin" ]; then + ${csudo}rm -rf /Applications/TDengine.app && + ${csudo}mkdir -p /Applications/TDengine.app/Contents/MacOS/ && + ${csudo}cp ${script_dir}/TDengine /Applications/TDengine.app/Contents/MacOS/ && + echo "" | ${csudo}tee /Applications/TDengine.app/Contents/Info.plist > /dev/null && + ${csudo}sips -i ${script_dir}/logo.png > /dev/null && + DeRez -only icns ${script_dir}/logo.png | ${csudo}tee /Applications/TDengine.app/mac_logo.rsrc > /dev/null && + ${csudo}rez -append /Applications/TDengine.app/mac_logo.rsrc -o $'/Applications/TDengine.app/Icon\r' && + ${csudo}SetFile -a C /Applications/TDengine.app/ && + ${csudo}rm /Applications/TDengine.app/mac_logo.rsrc fi } @@ -610,6 +592,7 @@ function update_TDengine() { install_examples install_web install_bin + install_app install_service install_taosadapter_service @@ -633,7 +616,11 @@ function update_TDengine() { [ -f ${service_config_dir}/taosadapter.service ] && [ -f ${installDir}/bin/taosadapter ] && \ echo -e "${GREEN_DARK}To start Taos Adapter ${NC}: ${csudo}service taosadapter start${NC}" else - echo -e "${GREEN_DARK}To start ${productName} ${NC}: ${serverName}${NC}" + if [ "$osType" != "Darwin" ]; then + echo -e "${GREEN_DARK}To start ${productName} ${NC}: ${serverName}${NC}" + else + echo -e "${GREEN_DARK}To start service ${NC}: launchctl start ${serverName}${NC}" + fi [ -f ${installDir}/bin/taosadapter ] && \ echo -e "${GREEN_DARK}To start Taos Adapter ${NC}: taosadapter &${NC}" fi @@ -656,6 +643,7 @@ function install_TDengine() { # install_connector install_examples install_bin + install_app install_service install_taosadapter_service @@ -679,7 +667,11 @@ function install_TDengine() { [ -f ${service_config_dir}/taosadapter.service ] && [ -f ${installDir}/bin/taosadapter ] && \ echo -e "${GREEN_DARK}To start Taos Adapter ${NC}: ${csudo}service taosadapter start${NC}" else - echo -e "${GREEN_DARK}To start ${productName} ${NC}: ./${serverName}${NC}" + if [ "$osType" != "Darwin" ]; then + echo -e "${GREEN_DARK}To start ${productName} ${NC}: ${serverName}${NC}" + else + echo -e "${GREEN_DARK}To start service ${NC}: launchctl start ${serverName}${NC}" + fi [ -f ${installDir}/bin/taosadapter ] && \ echo -e "${GREEN_DARK}To start Taos Adapter ${NC}: taosadapter &${NC}" fi @@ -694,16 +686,10 @@ echo source directory: $1 echo binary directory: $2 if [ -x ${data_dir}/dnode/dnodeCfg.json ]; then echo -e "\033[44;31;5mThe default data directory ${data_dir} contains old data of tdengine 2.x, please clear it before installing!\033[0m" -elif [ "$osType" != "Darwin" ]; then +else if [ -x ${bin_dir}/${clientName} ]; then update_TDengine else install_TDengine fi -else - if [ -x ${bin_dir}/${clientName} ] || [ -x ${bin_2_dir}/${clientName} ]; then - update_TDengine - else - install_TDengine - fi fi diff --git a/packaging/tools/post.sh b/packaging/tools/post.sh index fcc8a2a942..29d4ac017c 100755 --- a/packaging/tools/post.sh +++ b/packaging/tools/post.sh @@ -7,27 +7,52 @@ iplist="" serverFqdn="" -# -----------------------Variables definition--------------------- -script_dir=$(dirname $(readlink -f "$0")) +osType=`uname` + # Dynamic directory data_dir="/var/lib/taos" log_dir="/var/log/taos" -data_link_dir="/usr/local/taos/data" -log_link_dir="/usr/local/taos/log" -install_main_dir="/usr/local/taos" +cfg_install_dir="/etc/taos" + +if [ "$osType" != "Darwin" ]; then + script_dir=$(dirname $(readlink -f "$0")) + verNumber="" + lib_file_ext="so" + + bin_link_dir="/usr/bin" + lib_link_dir="/usr/lib" + lib64_link_dir="/usr/lib64" + inc_link_dir="/usr/include" + + install_main_dir="/usr/local/taos" +else + script_dir=${source_dir}/packaging/tools + verNumber=`ls tdengine/driver | grep -E "libtaos\.[0-9]\.[0-9]" | sed "s/libtaos.//g" | sed "s/.dylib//g" | head -n 1` + lib_file_ext="dylib" + + bin_link_dir="/usr/local/bin" + lib_link_dir="/usr/local/lib" + lib64_link_dir="/usr/local/lib" + inc_link_dir="/usr/local/include" + + if [ -d "/usr/local/Cellar/" ];then + install_main_dir="/usr/local/Cellar/tdengine/${verNumber}" + elif [ -d "/opt/homebrew/Cellar/" ];then + install_main_dir="/opt/homebrew/Cellar/tdengine/${verNumber}" + else + install_main_dir="/usr/local/taos" + fi +fi + +data_link_dir="${install_main_dir}/data" +log_link_dir="${install_main_dir}/log" # static directory -cfg_dir="/usr/local/taos/cfg" -bin_dir="/usr/local/taos/bin" -lib_dir="/usr/local/taos/driver" -init_d_dir="/usr/local/taos/init.d" -inc_dir="/usr/local/taos/include" - -cfg_install_dir="/etc/taos" -bin_link_dir="/usr/bin" -lib_link_dir="/usr/lib" -lib64_link_dir="/usr/lib64" -inc_link_dir="/usr/include" +cfg_dir="${install_main_dir}/cfg" +bin_dir="${install_main_dir}/bin" +lib_dir="${install_main_dir}/driver" +init_d_dir="${install_main_dir}/init.d" +inc_dir="${install_main_dir}/include" service_config_dir="/etc/systemd/system" @@ -40,8 +65,10 @@ GREEN_UNDERLINE='\033[4;32m' NC='\033[0m' csudo="" +csudouser="" if command -v sudo > /dev/null; then csudo="sudo " + csudouser="sudo -u ${USER} " fi initd_mod=0 @@ -63,6 +90,14 @@ elif $(which service &> /dev/null); then else service_mod=2 fi +if [ "$osType" = "Darwin" ]; then + if [ -d "${install_main_dir}" ];then + ${csudo}rm -rf ${install_main_dir} + fi + ${csudo}mkdir -p ${install_main_dir} + ${csudo}rm -rf ${install_main_dir} + ${csudo}cp -rf tdengine ${install_main_dir} +fi function kill_taosadapter() { # ${csudo}pkill -f taosadapter || : @@ -96,22 +131,24 @@ function install_lib() { ${csudo}rm -f ${lib_link_dir}/libtaos* || : ${csudo}rm -f ${lib64_link_dir}/libtaos* || : - [ -f ${lib_link_dir}/libtaosws.so ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.so || : - [ -f ${lib64_link_dir}/libtaosws.so ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.so || : + [ -f ${lib_link_dir}/libtaosws.${lib_file_ext} ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.${lib_file_ext} || : + [ -f ${lib64_link_dir}/libtaosws.${lib_file_ext} ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.${lib_file_ext} || : ${csudo}ln -s ${lib_dir}/libtaos.* ${lib_link_dir}/libtaos.so.1 ${csudo}ln -s ${lib_link_dir}/libtaos.so.1 ${lib_link_dir}/libtaos.so - [ -f ${lib_dir}/libtaosws.so ] && ${csudo}ln -sf ${lib_dir}/libtaosws.so ${lib_link_dir}/libtaosws.so ||: + [ -f ${lib_dir}/libtaosws.${lib_file_ext} ] && ${csudo}ln -sf ${lib_dir}/libtaosws.${lib_file_ext} ${lib_link_dir}/libtaosws.${lib_file_ext} ||: if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.so ]]; then ${csudo}ln -s ${lib_dir}/libtaos.* ${lib64_link_dir}/libtaos.so.1 || : ${csudo}ln -s ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so || : - [ -f ${lib_dir}/libtaosws.so ] && ${csudo}ln -sf ${lib_dir}/libtaosws.so ${lib64_link_dir}/libtaosws.so || : + [ -f ${lib_dir}/libtaosws.${lib_file_ext} ] && ${csudo}ln -sf ${lib_dir}/libtaosws.${lib_file_ext} ${lib64_link_dir}/libtaosws.${lib_file_ext} || : fi - ${csudo}ldconfig + if [ "$osType" != "Darwin" ]; then + ${csudo}ldconfig + fi } function install_bin() { @@ -138,6 +175,7 @@ function install_bin() { [ -x ${bin_dir}/TDinsight.sh ] && ${csudo}ln -sf ${bin_dir}/TDinsight.sh ${bin_link_dir}/TDinsight.sh || : [ -x ${bin_dir}/taosdump ] && ${csudo}ln -s ${bin_dir}/taosdump ${bin_link_dir}/taosdump || : [ -x ${bin_dir}/set_core.sh ] && ${csudo}ln -s ${bin_dir}/set_core.sh ${bin_link_dir}/set_core || : + [ -x ${bin_dir}/remove.sh ] && ${csudo}ln -s ${bin_dir}/remove.sh ${bin_link_dir}/rmtaos || : } function add_newHostname_to_hosts() { @@ -466,6 +504,14 @@ function install_service_on_systemd() { ${csudo}systemctl enable taosd } +function install_service_on_launchctl() { + if [ -f ${install_main_dir}/service/com.taosdata.taosd.plist ]; then + ${csudouser}launchctl unload -w /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || : + ${csudo}cp ${install_main_dir}/service/com.taosdata.taosd.plist /Library/LaunchDaemons/com.taosdata.taosd.plist || : + ${csudouser}launchctl load -w /Library/LaunchDaemons/com.taosdata.taosd.plist || : + fi +} + function install_taosadapter_service() { if ((${service_mod}==0)); then [ -f ${script_dir}/../cfg/taosadapter.service ] &&\ @@ -476,6 +522,7 @@ function install_taosadapter_service() { } function install_service() { + if [ "$osType" != "Darwin" ]; then if ((${service_mod}==0)); then install_service_on_systemd elif ((${service_mod}==1)); then @@ -485,6 +532,25 @@ function install_service() { kill_taosadapter kill_taosd fi + else + install_service_on_launchctl + fi +} + +function install_app() { + if [ "$osType" = "Darwin" ]; then + if [ -f ${install_main_dir}/service/TDengine ]; then + ${csudo}rm -rf /Applications/TDengine.app && + ${csudo}mkdir -p /Applications/TDengine.app/Contents/MacOS/ && + ${csudo}cp ${install_main_dir}/service/TDengine /Applications/TDengine.app/Contents/MacOS/ && + echo "" | ${csudo}tee /Applications/TDengine.app/Contents/Info.plist > /dev/null && + ${csudo}sips -i ${install_main_dir}/service/logo.png > /dev/null && + DeRez -only icns ${install_main_dir}/service/logo.png | ${csudo}tee /Applications/TDengine.app/mac_logo.rsrc > /dev/null && + ${csudo}rez -append /Applications/TDengine.app/mac_logo.rsrc -o $'/Applications/TDengine.app/Icon\r' && + ${csudo}SetFile -a C /Applications/TDengine.app/ && + ${csudo}rm /Applications/TDengine.app/mac_logo.rsrc + fi + fi } function install_TDengine() { @@ -492,7 +558,7 @@ function install_TDengine() { #install log and data dir , then ln to /usr/local/taos ${csudo}mkdir -p ${log_dir} && ${csudo}chmod 777 ${log_dir} - ${csudo}mkdir -p ${data_dir} + ${csudo}mkdir -p ${data_dir} && ${csudo}chmod 777 ${data_dir} ${csudo}rm -rf ${log_link_dir} || : ${csudo}rm -rf ${data_link_dir} || : @@ -508,6 +574,7 @@ function install_TDengine() { install_taosadapter_config install_taosadapter_service install_service + install_app # Ask if to start the service #echo diff --git a/packaging/tools/remove.sh b/packaging/tools/remove.sh index a648750904..6172fc9bc8 100755 --- a/packaging/tools/remove.sh +++ b/packaging/tools/remove.sh @@ -6,12 +6,31 @@ set -e #set -x verMode=edge +osType=`uname` RED='\033[0;31m' GREEN='\033[1;32m' NC='\033[0m' -installDir="/usr/local/taos" +if [ "$osType" != "Darwin" ]; then + installDir="/usr/local/taos" + bin_link_dir="/usr/bin" + lib_link_dir="/usr/lib" + lib64_link_dir="/usr/lib64" + inc_link_dir="/usr/include" +else + if [ -d "/usr/local/Cellar/" ];then + installDir="/usr/local/Cellar/tdengine/${verNumber}" + elif [ -d "/opt/homebrew/Cellar/" ];then + installDir="/opt/homebrew/Cellar/tdengine/${verNumber}" + else + installDir="/usr/local/taos" + fi + bin_link_dir="/usr/local/bin" + lib_link_dir="/usr/local/lib" + lib64_link_dir="/usr/local/lib" + inc_link_dir="/usr/local/include" +fi serverName="taosd" clientName="taos" uninstallScript="rmtaos" @@ -22,11 +41,8 @@ install_main_dir=${installDir} data_link_dir=${installDir}/data log_link_dir=${installDir}/log cfg_link_dir=${installDir}/cfg -bin_link_dir="/usr/bin" local_bin_link_dir="/usr/local/bin" -lib_link_dir="/usr/lib" -lib64_link_dir="/usr/lib64" -inc_link_dir="/usr/include" + service_config_dir="/etc/systemd/system" taos_service_name=${serverName} @@ -82,6 +98,7 @@ function clean_bin() { # Remove link ${csudo}rm -f ${bin_link_dir}/${clientName} || : ${csudo}rm -f ${bin_link_dir}/${serverName} || : + ${csudo}rm -f ${bin_link_dir}/udfd || : ${csudo}rm -f ${bin_link_dir}/taosadapter || : ${csudo}rm -f ${bin_link_dir}/taosBenchmark || : ${csudo}rm -f ${bin_link_dir}/taosdemo || : @@ -103,7 +120,7 @@ function clean_lib() { [ -f ${lib_link_dir}/libtaosws.so ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.so || : ${csudo}rm -f ${lib64_link_dir}/libtaos.* || : - [ -f ${lib64_link_dir}/libtaosws.so ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.so || : + [ -f ${lib64_link_dir}/libtaosws.* ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.* || : #${csudo}rm -rf ${v15_java_app_dir} || : } @@ -195,12 +212,20 @@ function clean_service_on_sysvinit() { fi } +function clean_service_on_launchctl() { + ${csudouser}launchctl unload -w /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || : + ${csudo}rm /Library/LaunchDaemons/com.taosdata.taosd.plist > /dev/null 2>&1 || : +} + function clean_service() { if ((${service_mod} == 0)); then clean_service_on_systemd elif ((${service_mod} == 1)); then clean_service_on_sysvinit else + if [ "$osType" = "Darwin" ]; then + clean_service_on_launchctl + fi kill_taosadapter kill_taosd kill_tarbitrator @@ -241,6 +266,9 @@ elif echo $osinfo | grep -qwi "centos"; then # echo "this is centos system" ${csudo}rpm -e --noscripts tdengine >/dev/null 2>&1 || : fi +if [ "$osType" = "Darwin" ]; then + ${csudo}rm -rf /Applications/TDengine.app +fi echo -e "${GREEN}${productName} is removed successfully!${NC}" echo diff --git a/source/libs/stream/src/streamMeta.c b/source/libs/stream/src/streamMeta.c index 1442ed2e05..63a28e17ed 100644 --- a/source/libs/stream/src/streamMeta.c +++ b/source/libs/stream/src/streamMeta.c @@ -32,7 +32,7 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF } sprintf(streamPath, "%s/%s", pMeta->path, "checkpoints"); - mkdir(streamPath, 0755); + taosMulModeMkDir(streamPath, 0755); taosMemoryFree(streamPath); if (tdbTbOpen("task.db", sizeof(int32_t), -1, NULL, pMeta->db, &pMeta->pTaskDb) < 0) { diff --git a/source/libs/tdb/src/db/tdbDb.c b/source/libs/tdb/src/db/tdbDb.c index cc8bdca75d..42aeeae19a 100644 --- a/source/libs/tdb/src/db/tdbDb.c +++ b/source/libs/tdb/src/db/tdbDb.c @@ -62,7 +62,7 @@ int32_t tdbOpen(const char *dbname, int32_t szPage, int32_t pages, TDB **ppDb) { } memset(pDb->pgrHash, 0, tsize); - mkdir(dbname, 0755); + taosMulModeMkDir(dbname, 0755); #ifdef USE_MAINDB // open main db diff --git a/source/os/src/osDir.c b/source/os/src/osDir.c index cf74525543..0cc946ac21 100644 --- a/source/os/src/osDir.c +++ b/source/os/src/osDir.c @@ -121,6 +121,8 @@ int32_t taosMkDir(const char *dirname) { if (taosDirExist(dirname)) return 0; #ifdef WINDOWS int32_t code = _mkdir(dirname, 0755); +#elif defined(DARWIN) + int32_t code = mkdir(dirname, 0777); #else int32_t code = mkdir(dirname, 0755); #endif @@ -156,6 +158,8 @@ int32_t taosMulMkDir(const char *dirname) { *pos = '\0'; #ifdef WINDOWS code = _mkdir(temp, 0755); +#elif defined(DARWIN) + code = mkdir(dirname, 0777); #else code = mkdir(temp, 0755); #endif @@ -170,6 +174,8 @@ int32_t taosMulMkDir(const char *dirname) { if (*(pos - 1) != TD_DIRSEP[0]) { #ifdef WINDOWS code = _mkdir(temp, 0755); +#elif defined(DARWIN) + code = mkdir(dirname, 0777); #else code = mkdir(temp, 0755); #endif @@ -179,7 +185,6 @@ int32_t taosMulMkDir(const char *dirname) { } } - // int32_t code = mkdir(dirname, 0755); if (code < 0 && errno == EEXIST) { return 0; } @@ -215,6 +220,8 @@ int32_t taosMulModeMkDir(const char *dirname, int mode) { *pos = '\0'; #ifdef WINDOWS code = _mkdir(temp, mode); +#elif defined(DARWIN) + code = mkdir(dirname, 0777); #else code = mkdir(temp, mode); #endif @@ -229,6 +236,8 @@ int32_t taosMulModeMkDir(const char *dirname, int mode) { if (*(pos - 1) != TD_DIRSEP[0]) { #ifdef WINDOWS code = _mkdir(temp, mode); +#elif defined(DARWIN) + code = mkdir(dirname, 0777); #else code = mkdir(temp, mode); #endif diff --git a/source/os/src/osEnv.c b/source/os/src/osEnv.c index 8f6800c7be..9511230f8d 100644 --- a/source/os/src/osEnv.c +++ b/source/os/src/osEnv.c @@ -59,34 +59,18 @@ void osDefaultInit() { if (tmpDir != NULL) { strcpy(tsTempDir, tmpDir); } - - if (configDir[0] == 0) { - strcpy(configDir, "C:\\TDengine\\cfg"); - } - strcpy(tsDataDir, "C:\\TDengine\\data"); - strcpy(tsLogDir, "C:\\TDengine\\log"); - strcpy(tsTempDir, "C:\\Windows\\Temp"); strcpy(tsOsName, "Windows"); - #elif defined(_TD_DARWIN_64) - if (configDir[0] == 0) { - strcpy(configDir, "/usr/local/etc/taos"); - } - strcpy(tsDataDir, "/usr/local/var/lib/taos"); - strcpy(tsLogDir, "/usr/local/var/log/taos"); - strcpy(tsTempDir, "/tmp/taosd"); strcpy(tsOsName, "Darwin"); - #else - if (configDir[0] == 0) { - strcpy(configDir, "/etc/taos"); - } - strcpy(tsDataDir, "/var/lib/taos"); - strcpy(tsLogDir, "/var/log/taos"); - strcpy(tsTempDir, "/tmp"); strcpy(tsOsName, "Linux"); - #endif + if (configDir[0] == 0) { + strcpy(configDir, TD_CFG_DIR_PATH); + } + strcpy(tsDataDir, TD_DATA_DIR_PATH); + strcpy(tsLogDir, TD_LOG_DIR_PATH); + strcpy(tsTempDir, TD_TMP_DIR_PATH); } void osUpdate() { diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 03097e31b9..98d21a4f2c 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,6 +1,11 @@ IF (TD_WEBSOCKET) + IF (TD_LINUX) + SET(websocket_lib_file "libtaosws.so") + ELSEIF (TD_DARWIN) + SET(websocket_lib_file "libtaosws.dylib") + ENDIF () MESSAGE("${Green} use libtaos-ws${ColourReset}") - IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs/target/release/libtaosws.so" OR "${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs/target/release/libtaosws.so" IS_NEWER_THAN "${CMAKE_SOURCE_DIR}/.git/modules/tools/taosws-rs/FETCH_HEAD") + IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs/target/release/${websocket_lib_file}" OR "${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs/target/release/${websocket_lib_file}" IS_NEWER_THAN "${CMAKE_SOURCE_DIR}/.git/modules/tools/taosws-rs/FETCH_HEAD") include(ExternalProject) ExternalProject_Add(taosws-rs PREFIX "taosws-rs" @@ -15,7 +20,7 @@ IF (TD_WEBSOCKET) COMMAND cargo build --release -p taos-ws-sys COMMAND ./taos-ws-sys/ci/package.sh INSTALL_COMMAND - COMMAND cmake -E copy target/libtaosws/libtaosws.so ${CMAKE_BINARY_DIR}/build/lib + COMMAND cmake -E copy target/libtaosws/${websocket_lib_file} ${CMAKE_BINARY_DIR}/build/lib COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include COMMAND cmake -E copy target/libtaosws/taosws.h ${CMAKE_BINARY_DIR}/build/include ) @@ -34,7 +39,7 @@ IF (TD_WEBSOCKET) COMMAND cargo build --release -p taos-ws-sys COMMAND ./taos-ws-sys/ci/package.sh INSTALL_COMMAND - COMMAND cmake -E copy target/libtaosws/libtaosws.so ${CMAKE_BINARY_DIR}/build/lib + COMMAND cmake -E copy target/libtaosws/${websocket_lib_file} ${CMAKE_BINARY_DIR}/build/lib COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include COMMAND cmake -E copy target/libtaosws/taosws.h ${CMAKE_BINARY_DIR}/build/include ) diff --git a/tools/shell/CMakeLists.txt b/tools/shell/CMakeLists.txt index 488b623f89..45a6f8c16f 100644 --- a/tools/shell/CMakeLists.txt +++ b/tools/shell/CMakeLists.txt @@ -6,6 +6,10 @@ 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) + ADD_DEFINITIONS(-DWEBSOCKET -I${CMAKE_BINARY_DIR}/build/include) + SET(LINK_WEBSOCKET "${CMAKE_BINARY_DIR}/build/lib/libtaosws.dylib") + ADD_DEPENDENCIES(shell taosws-rs) ELSE () SET(LINK_WEBSOCKET "") ENDIF () From f569355d065b279152d05e99490cfa59e7d43079 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao@163.com> Date: Sat, 8 Oct 2022 09:38:56 +0800 Subject: [PATCH 129/143] fix(stream):memory leak --- source/libs/executor/src/tfill.c | 60 +++++++++++-------- source/libs/executor/src/timewindowoperator.c | 21 +++++-- source/libs/stream/src/streamState.c | 17 +++++- .../stream/distributeIntervalRetrive0.sim | 40 +++++++++++++ .../tsim/stream/fillIntervalDelete1.sim | 18 ++++++ .../script/tsim/stream/fillIntervalLinear.sim | 18 ++++++ .../tsim/stream/fillIntervalPrevNext.sim | 17 ++++++ .../script/tsim/stream/fillIntervalValue.sim | 15 +++++ 8 files changed, 172 insertions(+), 34 deletions(-) diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c index f6fd8c8920..27b8e83a20 100644 --- a/source/libs/executor/src/tfill.c +++ b/source/libs/executor/src/tfill.c @@ -706,6 +706,9 @@ void* destroyStreamFillSupporter(SStreamFillSupporter* pFillSup) { pFillSup->pAllColInfo = destroyFillColumnInfo(pFillSup->pAllColInfo, pFillSup->numOfFillCols, pFillSup->numOfAllCols); tSimpleHashCleanup(pFillSup->pResMap); pFillSup->pResMap = NULL; + streamStateReleaseBuf(NULL, NULL, pFillSup->cur.pRowVal); + pFillSup->cur.pRowVal = NULL; + taosMemoryFree(pFillSup); return NULL; } @@ -722,6 +725,7 @@ void* destroyStreamFillInfo(SStreamFillInfo* pFillInfo) { taosMemoryFreeClear(pFillInfo->pResRow); } pFillInfo->pLinearInfo = destroyStreamFillLinearInfo(pFillInfo->pLinearInfo); + taosArrayDestroy(pFillInfo->delRanges); taosMemoryFree(pFillInfo); return NULL; } @@ -732,6 +736,8 @@ void destroyStreamFillOperatorInfo(void* param) { pInfo->pFillSup = destroyStreamFillSupporter(pInfo->pFillSup); pInfo->pRes = blockDataDestroy(pInfo->pRes); pInfo->pSrcBlock = blockDataDestroy(pInfo->pSrcBlock); + pInfo->pPrevSrcBlock = blockDataDestroy(pInfo->pPrevSrcBlock); + pInfo->pDelRes = blockDataDestroy(pInfo->pDelRes); pInfo->pColMatchColInfo = taosArrayDestroy(pInfo->pColMatchColInfo); taosMemoryFree(pInfo); } @@ -743,6 +749,7 @@ static void resetFillWindow(SResultRowData* pRowData) { void resetPrevAndNextWindow(SStreamFillSupporter* pFillSup, SStreamState* pState) { resetFillWindow(&pFillSup->prev); + streamStateReleaseBuf(NULL, NULL, pFillSup->cur.pRowVal); resetFillWindow(&pFillSup->cur); resetFillWindow(&pFillSup->next); resetFillWindow(&pFillSup->nextNext); @@ -753,12 +760,12 @@ void getCurWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupI resetPrevAndNextWindow(pFillSup, pState); SWinKey key = {.ts = ts, .groupId = groupId}; - void* curVal = NULL; + // void* curVal = NULL; int32_t curVLen = 0; - int32_t code = streamStateFillGet(pState, &key, (void**)&curVal, &curVLen); + int32_t code = streamStateFillGet(pState, &key, (void**)&pFillSup->cur.pRowVal, &curVLen); ASSERT(code == TSDB_CODE_SUCCESS); pFillSup->cur.key = key.ts; - pFillSup->cur.pRowVal = curVal; + // pFillSup->cur.pRowVal = curVal; } void getWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SStreamFillSupporter* pFillSup) { @@ -777,11 +784,9 @@ void getWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, SWinKey preKey = {.groupId = groupId}; void* preVal = NULL; int32_t preVLen = 0; - if (pCur) { - code = streamStateGetGroupKVByCur(pCur, &preKey, (const void**)&preVal, &preVLen); - } + code = streamStateGetGroupKVByCur(pCur, &preKey, (const void**)&preVal, &preVLen); - if (pCur && code == TSDB_CODE_SUCCESS) { + if (code == TSDB_CODE_SUCCESS) { pFillSup->prev.key = preKey.ts; pFillSup->prev.pRowVal = preVal; @@ -790,35 +795,36 @@ void getWindowFromDiscBuf(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId, code = streamStateCurNext(pState, pCur); if (code != TSDB_CODE_SUCCESS) { + streamStateFreeCur(pCur); pCur = NULL; } } else { + streamStateFreeCur(pCur); pCur = streamStateFillSeekKeyNext(pState, &key); } - if (pCur) { - SWinKey nextKey = {.groupId = groupId}; - void* nextVal = NULL; - int32_t nextVLen = 0; - code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextVLen); - if (code == TSDB_CODE_SUCCESS) { - pFillSup->next.key = nextKey.ts; - pFillSup->next.pRowVal = nextVal; - if (pFillSup->type == TSDB_FILL_PREV || pFillSup->type == TSDB_FILL_NEXT) { - code = streamStateCurNext(pState, pCur); + SWinKey nextKey = {.groupId = groupId}; + void* nextVal = NULL; + int32_t nextVLen = 0; + code = streamStateGetGroupKVByCur(pCur, &nextKey, (const void**)&nextVal, &nextVLen); + if (code == TSDB_CODE_SUCCESS) { + pFillSup->next.key = nextKey.ts; + pFillSup->next.pRowVal = nextVal; + if (pFillSup->type == TSDB_FILL_PREV || pFillSup->type == TSDB_FILL_NEXT) { + code = streamStateCurNext(pState, pCur); + if (code == TSDB_CODE_SUCCESS) { + SWinKey nextNextKey = {.groupId = groupId}; + void* nextNextVal = NULL; + int32_t nextNextVLen = 0; + code = streamStateGetGroupKVByCur(pCur, &nextNextKey, (const void**)&nextNextVal, &nextNextVLen); if (code == TSDB_CODE_SUCCESS) { - SWinKey nextNextKey = {.groupId = groupId}; - void* nextNextVal = NULL; - int32_t nextNextVLen = 0; - code = streamStateGetGroupKVByCur(pCur, &nextNextKey, (const void**)&nextNextVal, &nextNextVLen); - if (code == TSDB_CODE_SUCCESS) { - pFillSup->nextNext.key = nextNextKey.ts; - pFillSup->nextNext.pRowVal = nextNextVal; - } + pFillSup->nextNext.key = nextNextKey.ts; + pFillSup->nextNext.pRowVal = nextNextVal; } } } } + streamStateFreeCur(pCur); } static bool hasPrevWindow(SStreamFillSupporter* pFillSup) { return pFillSup->prev.key != INT64_MIN; } @@ -1388,6 +1394,7 @@ static void doDeleteFillResult(SOperatorInfo* pOperator) { } pInfo->srcDelRowIndex++; } + streamStateFreeCur(pCur); doDeleteFillResultImpl(pOperator, ts, endTs, groupId); } pFillInfo->current = pFillInfo->end + 1; @@ -1538,9 +1545,12 @@ static int32_t initResultBuf(SStreamFillSupporter* pFillSup) { pFillSup->next.key = INT64_MIN; pFillSup->nextNext.key = INT64_MIN; pFillSup->prev.key = INT64_MIN; + pFillSup->cur.key = INT64_MIN; pFillSup->next.pRowVal = NULL; pFillSup->nextNext.pRowVal = NULL; pFillSup->prev.pRowVal = NULL; + pFillSup->cur.pRowVal = NULL; + return TSDB_CODE_SUCCESS; } diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index dceb696d54..8df6f15a1b 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -879,7 +879,12 @@ static void removeResults(SArray* pWins, SHashObj* pUpdatedMap) { int32_t size = taosArrayGetSize(pWins); for (int32_t i = 0; i < size; i++) { SWinKey* pW = taosArrayGet(pWins, i); - taosHashRemove(pUpdatedMap, pW, sizeof(SWinKey)); + void* tmp = taosHashGet(pUpdatedMap, pW, sizeof(SWinKey)); + if (tmp) { + void* value = *(void**)tmp; + taosMemoryFree(value); + taosHashRemove(pUpdatedMap, pW, sizeof(SWinKey)); + } } } @@ -1410,7 +1415,12 @@ static void doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, int3 taosArrayPush(pUpWins, &winRes); } if (pUpdatedMap) { - taosHashRemove(pUpdatedMap, &winRes, sizeof(SWinKey)); + void* tmp = taosHashGet(pUpdatedMap, &winRes, sizeof(SWinKey)); + if (tmp) { + void* value = *(void**)tmp; + taosMemoryFree(value); + taosHashRemove(pUpdatedMap, &winRes, sizeof(SWinKey)); + } } getNextTimeWindow(pInterval, pInterval->precision, TSDB_ORDER_ASC, &win); } while (win.ekey <= endTsCols[i]); @@ -2872,12 +2882,13 @@ static void rebuildIntervalWindow(SOperatorInfo* pOperator, SExprSupp* pSup, SAr pChildSup->rowEntryInfoOffset, &pChInfo->aggSup); updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &parentWin, true); compactFunctions(pSup->pCtx, pChildSup->pCtx, numOfOutput, pTaskInfo, &pInfo->twAggSup.timeWindowData); + releaseOutputBuf(pChInfo->pState, pWinRes, pChResult); } if (num > 0 && pUpdatedMap) { saveWinResultInfo(pCurResult->win.skey, pWinRes->groupId, pUpdatedMap); saveOutputBuf(pInfo->pState, pWinRes, pCurResult, pInfo->aggSup.resultRowSize); - releaseOutputBuf(pInfo->pState, pWinRes, pCurResult); } + releaseOutputBuf(pInfo->pState, pWinRes, pCurResult); } } @@ -2891,9 +2902,7 @@ bool isDeletedWindow(STimeWindow* pWin, uint64_t groupId, SAggSupporter* pSup) { bool isDeletedStreamWindow(STimeWindow* pWin, uint64_t groupId, SStreamState* pState, STimeWindowAggSupp* pTwSup) { if (pWin->ekey < pTwSup->maxTs - pTwSup->deleteMark) { SWinKey key = {.ts = pWin->skey, .groupId = groupId}; - void* pVal = NULL; - int32_t size = 0; - if (streamStateGet(pState, &key, &pVal, &size) == TSDB_CODE_SUCCESS) { + if (streamStateGet(pState, &key, NULL, 0) == TSDB_CODE_SUCCESS) { return false; } return true; diff --git a/source/libs/stream/src/streamState.c b/source/libs/stream/src/streamState.c index da0d0fbd6d..596c16747b 100644 --- a/source/libs/stream/src/streamState.c +++ b/source/libs/stream/src/streamState.c @@ -196,6 +196,7 @@ int32_t streamStateClear(SStreamState* pState) { SStreamStateCur* pCur = streamStateSeekKeyNext(pState, &key); SWinKey delKey = {0}; int32_t code = streamStateGetKVByCur(pCur, &delKey, NULL, 0); + streamStateFreeCur(pCur); if (code == 0) { streamStateDel(pState, &delKey); } else { @@ -225,6 +226,9 @@ int32_t streamStateAddIfNotExist(SStreamState* pState, const SWinKey* key, void* int32_t streamStateReleaseBuf(SStreamState* pState, const SWinKey* key, void* pVal) { // todo refactor + if (!pVal) { + return 0; + } streamFreeVal(pVal); return 0; } @@ -236,7 +240,7 @@ SStreamStateCur* streamStateGetCur(SStreamState* pState, const SWinKey* key) { int32_t c; SStateKey sKey = {.key = *key, .opNum = pState->number}; - tdbTbcMoveTo(pCur->pCur, key, sizeof(SWinKey), &c); + tdbTbcMoveTo(pCur->pCur, &sKey, sizeof(SStateKey), &c); if (c != 0) { taosMemoryFree(pCur); return NULL; @@ -253,7 +257,7 @@ SStreamStateCur* streamStateFillGetCur(SStreamState* pState, const SWinKey* key) int32_t c; tdbTbcMoveTo(pCur->pCur, key, sizeof(SWinKey), &c); if (c != 0) { - taosMemoryFree(pCur); + streamStateFreeCur(pCur); return NULL; } return pCur; @@ -266,6 +270,7 @@ SStreamStateCur* streamStateGetAndCheckCur(SStreamState* pState, SWinKey* key) { if (code == 0) { return pCur; } + streamStateFreeCur(pCur); } return NULL; } @@ -300,6 +305,9 @@ int32_t streamStateFillGetKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const vo } int32_t streamStateGetGroupKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen) { + if (!pCur) { + return -1; + } uint64_t groupId = pKey->groupId; int32_t code = streamStateFillGetKVByCur(pCur, pKey, pVal, pVLen); if (code == 0) { @@ -360,7 +368,7 @@ SStreamStateCur* streamStateSeekKeyNext(SStreamState* pState, const SWinKey* key SStreamStateCur* streamStateFillSeekKeyNext(SStreamState* pState, const SWinKey* key) { SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur)); - if (pCur == NULL) { + if (!pCur) { return NULL; } if (tdbTbcOpen(pState->pFillStateDb, &pCur->pCur, NULL) < 0) { @@ -411,6 +419,9 @@ SStreamStateCur* streamStateFillSeekKeyPrev(SStreamState* pState, const SWinKey* } int32_t streamStateCurNext(SStreamState* pState, SStreamStateCur* pCur) { + if (!pCur) { + return -1; + } // return tdbTbcMoveToNext(pCur->pCur); } diff --git a/tests/script/tsim/stream/distributeIntervalRetrive0.sim b/tests/script/tsim/stream/distributeIntervalRetrive0.sim index 79edea2a3c..bea70b1639 100644 --- a/tests/script/tsim/stream/distributeIntervalRetrive0.sim +++ b/tests/script/tsim/stream/distributeIntervalRetrive0.sim @@ -3,12 +3,15 @@ system sh/deploy.sh -n dnode1 -i 1 system sh/deploy.sh -n dnode2 -i 2 system sh/exec.sh -n dnode1 -s start +#==system sh/exec.sh -n dnode1 -s start -v + sleep 50 sql connect sql create dnode $hostname2 port 7200 system sh/exec.sh -n dnode2 -s start +#==system sh/exec.sh -n dnode2 -s start -v print ===== step1 $x = 0 @@ -232,4 +235,41 @@ endi print loop3 over + + + + +#==system sh/exec.sh -n dnode1 -s stop -x SIGINT +#==print =============== check +#==$null= + +#==system_content sh/checkValgrind.sh -n dnode1 +#==print cmd return result ----> [ $system_content ] +#==if $system_content > 0 then +#== return -1 +#==endi + +#==if $system_content == $null then +#== return -1 +#==endi + + + +#==system sh/exec.sh -n dnode2 -s stop -x SIGINT +#==print =============== check +#==$null= + +#==system_content sh/checkValgrind.sh -n dnode2 +#==print cmd return result ----> [ $system_content ] +#==if $system_content > 0 then +#== return -1 +#==endi + +#==if $system_content == $null then +#== return -1 +#==endi +#==return 1 + + + system sh/stop_dnodes.sh diff --git a/tests/script/tsim/stream/fillIntervalDelete1.sim b/tests/script/tsim/stream/fillIntervalDelete1.sim index 8e6972975e..e14062e830 100644 --- a/tests/script/tsim/stream/fillIntervalDelete1.sim +++ b/tests/script/tsim/stream/fillIntervalDelete1.sim @@ -4,6 +4,8 @@ looptest: system sh/stop_dnodes.sh system sh/deploy.sh -n dnode1 -i 1 system sh/exec.sh -n dnode1 -s start +#==system sh/exec.sh -n dnode1 -s start -v + sleep 200 sql connect @@ -353,6 +355,22 @@ endi +#==system sh/exec.sh -n dnode1 -s stop -x SIGINT +#==print =============== check +#==$null= + +#==system_content sh/checkValgrind.sh -n dnode1 +#==print cmd return result ----> [ $system_content ] +#==if $system_content > 0 then +#== return -1 +#==endi + +#==if $system_content == $null then +#== return -1 +#==endi +#==return 1 + + sql drop stream if exists streams0; diff --git a/tests/script/tsim/stream/fillIntervalLinear.sim b/tests/script/tsim/stream/fillIntervalLinear.sim index 46ff785fd3..4d0f101b6c 100644 --- a/tests/script/tsim/stream/fillIntervalLinear.sim +++ b/tests/script/tsim/stream/fillIntervalLinear.sim @@ -4,6 +4,8 @@ looptest: system sh/stop_dnodes.sh system sh/deploy.sh -n dnode1 -i 1 system sh/exec.sh -n dnode1 -s start +#==system sh/exec.sh -n dnode1 -s start -v + sleep 200 sql connect @@ -671,6 +673,22 @@ endi + + +#==system sh/exec.sh -n dnode1 -s stop -x SIGINT +#==print =============== check +#==$null= + +#==system_content sh/checkValgrind.sh -n dnode1 +#==print cmd return result ----> [ $system_content ] +#==if $system_content > 0 then +#== return -1 +#==endi + +#==if $system_content == $null then +#== return -1 +#==endi +#==return 1 sql drop stream if exists streams0; diff --git a/tests/script/tsim/stream/fillIntervalPrevNext.sim b/tests/script/tsim/stream/fillIntervalPrevNext.sim index 5eab5fdac1..4eadd7e7b1 100644 --- a/tests/script/tsim/stream/fillIntervalPrevNext.sim +++ b/tests/script/tsim/stream/fillIntervalPrevNext.sim @@ -4,6 +4,8 @@ looptest: system sh/stop_dnodes.sh system sh/deploy.sh -n dnode1 -i 1 system sh/exec.sh -n dnode1 -s start +#==system sh/exec.sh -n dnode1 -s start -v + sleep 200 sql connect @@ -1011,6 +1013,21 @@ endi + +#==system sh/exec.sh -n dnode1 -s stop -x SIGINT +#==print =============== check +#==$null= + +#==system_content sh/checkValgrind.sh -n dnode1 +#==print cmd return result ----> [ $system_content ] +#==if $system_content > 0 then +#== return -1 +#==endi + +#==if $system_content == $null then +#== return -1 +#==endi +#==return 1 diff --git a/tests/script/tsim/stream/fillIntervalValue.sim b/tests/script/tsim/stream/fillIntervalValue.sim index 113eae9270..49e68ae9f2 100644 --- a/tests/script/tsim/stream/fillIntervalValue.sim +++ b/tests/script/tsim/stream/fillIntervalValue.sim @@ -4,6 +4,7 @@ looptest: system sh/stop_dnodes.sh system sh/deploy.sh -n dnode1 -i 1 system sh/exec.sh -n dnode1 -s start +#==system sh/exec.sh -n dnode1 -s start -v sleep 200 sql connect @@ -463,6 +464,20 @@ endi +#==system sh/exec.sh -n dnode1 -s stop -x SIGINT +#==print =============== check +#==$null= + +#==system_content sh/checkValgrind.sh -n dnode1 +#==print cmd return result ----> [ $system_content ] +#==if $system_content > 0 then +#== return -1 +#==endi + +#==if $system_content == $null then +#== return -1 +#==endi +#==return 1 From e98335bdfabf474c3de55370e452a5a503cab56e Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sat, 8 Oct 2022 11:29:46 +0800 Subject: [PATCH 130/143] fix: coverity issues --- source/dnode/mgmt/mgmt_vnode/src/vmFile.c | 7 ++++++- source/dnode/mgmt/mgmt_vnode/src/vmInt.c | 2 +- source/dnode/mnode/impl/src/mndAcct.c | 2 +- source/dnode/mnode/impl/src/mndCluster.c | 6 +++--- source/dnode/mnode/impl/src/mndDb.c | 10 +++++----- source/dnode/mnode/impl/src/mndDnode.c | 20 ++++++++++++-------- source/dnode/mnode/impl/src/mndFunc.c | 6 +++--- source/dnode/mnode/impl/src/mndOffset.c | 4 ++-- source/dnode/mnode/impl/src/mndStream.c | 6 +++--- source/dnode/mnode/impl/src/mndTopic.c | 6 +++--- source/dnode/mnode/impl/src/mndTrans.c | 8 +++++--- source/dnode/mnode/impl/src/mndUser.c | 10 +++++----- source/dnode/mnode/impl/src/mndVgroup.c | 16 ++++++++-------- source/dnode/mnode/sdb/src/sdbFile.c | 2 +- source/util/src/tuuid.c | 4 ++-- utils/tsim/src/simExe.c | 12 ++++++------ 16 files changed, 66 insertions(+), 55 deletions(-) diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmFile.c b/source/dnode/mgmt/mgmt_vnode/src/vmFile.c index 82fc286a94..2ae9faf7df 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmFile.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmFile.c @@ -135,7 +135,7 @@ _OVER: if (content != NULL) taosMemoryFree(content); if (root != NULL) cJSON_Delete(root); if (pFile != NULL) taosCloseFile(&pFile); - if (*ppCfgs == NULL && pCfgs != NULL) taosMemoryFree(pCfgs); + if (code != 0) taosMemoryFree(pCfgs); terrno = code; return code; @@ -157,6 +157,11 @@ int32_t vmWriteVnodeListToFile(SVnodeMgmt *pMgmt) { int32_t numOfVnodes = 0; SVnodeObj **pVnodes = vmGetVnodeListFromHash(pMgmt, &numOfVnodes); + if (pVnodes == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + ret = -1; + goto _OVER; + } int32_t len = 0; int32_t maxLen = MAX_CONTENT_LEN; diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c index 19ed2cbc88..bcc2e358d6 100644 --- a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c +++ b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c @@ -384,7 +384,7 @@ static int32_t vmStartVnodes(SVnodeMgmt *pMgmt) { for (int32_t v = 0; v < numOfVnodes; ++v) { int32_t t = v % threadNum; SVnodeThread *pThread = &threads[t]; - if (pThread->ppVnodes != NULL) { + if (pThread->ppVnodes != NULL && ppVnodes != NULL) { pThread->ppVnodes[pThread->vnodeNum++] = ppVnodes[v]; } } diff --git a/source/dnode/mnode/impl/src/mndAcct.c b/source/dnode/mnode/impl/src/mndAcct.c index 65857367f9..ffa5dc6d0b 100644 --- a/source/dnode/mnode/impl/src/mndAcct.c +++ b/source/dnode/mnode/impl/src/mndAcct.c @@ -77,7 +77,7 @@ static int32_t mndCreateDefaultAcct(SMnode *pMnode) { SSdbRaw *pRaw = mndAcctActionEncode(&acctObj); if (pRaw == NULL) return -1; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); mInfo("acct:%s, will be created when deploying, raw:%p", acctObj.acct, pRaw); diff --git a/source/dnode/mnode/impl/src/mndCluster.c b/source/dnode/mnode/impl/src/mndCluster.c index 3502ecf604..86df286e2a 100644 --- a/source/dnode/mnode/impl/src/mndCluster.c +++ b/source/dnode/mnode/impl/src/mndCluster.c @@ -231,7 +231,7 @@ static int32_t mndCreateDefaultCluster(SMnode *pMnode) { SSdbRaw *pRaw = mndClusterActionEncode(&clusterObj); if (pRaw == NULL) return -1; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)(pRaw, SDB_STATUS_READY); mInfo("cluster:%" PRId64 ", will be created when deploying, raw:%p", clusterObj.id, pRaw); @@ -248,7 +248,7 @@ static int32_t mndCreateDefaultCluster(SMnode *pMnode) { mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); @@ -326,7 +326,7 @@ static int32_t mndProcessUptimeTimer(SRpcMsg *pReq) { mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + (void)(pCommitRaw, SDB_STATUS_READY); if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 1d70f43834..5f158f0f91 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -730,7 +730,7 @@ static int32_t mndSetAlterDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOl return -1; } - sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY); return 0; } @@ -742,7 +742,7 @@ static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *p return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); return 0; } @@ -938,7 +938,7 @@ static int32_t mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pD sdbRelease(pSdb, pVgroup); return -1; } - sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED); + (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED); } sdbRelease(pSdb, pVgroup); @@ -956,7 +956,7 @@ static int32_t mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pD sdbRelease(pSdb, pStbRaw); return -1; } - sdbSetRawStatus(pStbRaw, SDB_STATUS_DROPPED); + (void)(pStbRaw, SDB_STATUS_DROPPED); } sdbRelease(pSdb, pStb); @@ -1052,7 +1052,7 @@ static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) { mError("trans:%d, failed to append redo log since %s", pTrans->id, terrstr()); goto _OVER; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + (void)(pCommitRaw, SDB_STATUS_READY); } int32_t rspLen = 0; diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index c8995eb6bc..94317f7ac8 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -101,7 +101,8 @@ static int32_t mndCreateDefaultDnode(SMnode *pMnode) { dnodeObj.createdTime = taosGetTimestampMs(); dnodeObj.updateTime = dnodeObj.createdTime; dnodeObj.port = tsServerPort; - memcpy(&dnodeObj.fqdn, tsLocalFqdn, TSDB_FQDN_LEN); + tstrncpy(dnodeObj.fqdn, tsLocalFqdn, TSDB_FQDN_LEN); + dnodeObj.fqdn[TSDB_FQDN_LEN - 1] = 0; snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", dnodeObj.fqdn, dnodeObj.port); pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_GLOBAL, NULL, "create-dnode"); @@ -110,7 +111,7 @@ static int32_t mndCreateDefaultDnode(SMnode *pMnode) { pRaw = mndDnodeActionEncode(&dnodeObj); if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); pRaw = NULL; if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER; @@ -190,7 +191,10 @@ _OVER: static int32_t mndDnodeActionInsert(SSdb *pSdb, SDnodeObj *pDnode) { mTrace("dnode:%d, perform insert action, row:%p", pDnode->id, pDnode); pDnode->offlineReason = DND_REASON_STATUS_NOT_RECEIVED; - snprintf(pDnode->ep, TSDB_EP_LEN - 1, "%s:%u", pDnode->fqdn, pDnode->port); + + char ep[TSDB_EP_LEN] = {0}; + snprintf(ep, TSDB_EP_LEN - 1, "%s:%u", pDnode->fqdn, pDnode->port); + tstrncpy(pDnode->ep, ep, TSDB_EP_LEN); return 0; } @@ -275,7 +279,7 @@ void mndGetDnodeData(SMnode *pMnode, SArray *pDnodeEps) { SDnodeEp dnodeEp = {0}; dnodeEp.id = pDnode->id; dnodeEp.ep.port = pDnode->port; - memcpy(dnodeEp.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN); + tstrncpy(dnodeEp.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN); sdbRelease(pSdb, pDnode); dnodeEp.isMnode = 0; @@ -485,7 +489,7 @@ static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pC dnodeObj.createdTime = taosGetTimestampMs(); dnodeObj.updateTime = dnodeObj.createdTime; dnodeObj.port = pCreate->port; - memcpy(dnodeObj.fqdn, pCreate->fqdn, TSDB_FQDN_LEN); + tstrncpy(dnodeObj.fqdn, pCreate->fqdn, TSDB_FQDN_LEN); snprintf(dnodeObj.ep, TSDB_EP_LEN - 1, "%s:%u", dnodeObj.fqdn, dnodeObj.port); pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_GLOBAL, pReq, "create-dnode"); @@ -494,7 +498,7 @@ static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pC pRaw = mndDnodeActionEncode(&dnodeObj); if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); pRaw = NULL; if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER; @@ -675,13 +679,13 @@ static int32_t mndDropDnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SM pRaw = mndDnodeActionEncode(pDnode); if (pRaw == NULL) goto _OVER; if (mndTransAppendRedolog(pTrans, pRaw) != 0) goto _OVER; - sdbSetRawStatus(pRaw, SDB_STATUS_DROPPING); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_DROPPING); pRaw = NULL; pRaw = mndDnodeActionEncode(pDnode); if (pRaw == NULL) goto _OVER; if (mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; - sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); pRaw = NULL; if (pMObj != NULL) { diff --git a/source/dnode/mnode/impl/src/mndFunc.c b/source/dnode/mnode/impl/src/mndFunc.c index ccab4774e2..c9b22fad3a 100644 --- a/source/dnode/mnode/impl/src/mndFunc.c +++ b/source/dnode/mnode/impl/src/mndFunc.c @@ -259,17 +259,17 @@ static int32_t mndDropFunc(SMnode *pMnode, SRpcMsg *pReq, SFuncObj *pFunc) { SSdbRaw *pRedoRaw = mndFuncActionEncode(pFunc); if (pRedoRaw == NULL) goto _OVER; if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) goto _OVER; - sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING); + (void)sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING); SSdbRaw *pUndoRaw = mndFuncActionEncode(pFunc); if (pUndoRaw == NULL) goto _OVER; if (mndTransAppendUndolog(pTrans, pUndoRaw) != 0) goto _OVER; - sdbSetRawStatus(pUndoRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pUndoRaw, SDB_STATUS_READY); SSdbRaw *pCommitRaw = mndFuncActionEncode(pFunc); if (pCommitRaw == NULL) goto _OVER; if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) goto _OVER; - sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED); if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER; diff --git a/source/dnode/mnode/impl/src/mndOffset.c b/source/dnode/mnode/impl/src/mndOffset.c index 797aa88670..2ada3e00bb 100644 --- a/source/dnode/mnode/impl/src/mndOffset.c +++ b/source/dnode/mnode/impl/src/mndOffset.c @@ -161,7 +161,7 @@ int32_t mndCreateOffsets(STrans *pTrans, const char *cgroup, const char *topicNa if (pOffsetRaw == NULL) { return -1; } - sdbSetRawStatus(pOffsetRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pOffsetRaw, SDB_STATUS_READY); // commit log or redo log? if (mndTransAppendRedolog(pTrans, pOffsetRaw) < 0) { return -1; @@ -208,7 +208,7 @@ static int32_t mndProcessCommitOffsetReq(SRpcMsg *pMsg) { } pOffsetObj->offset = pOffset->offset; SSdbRaw *pOffsetRaw = mndOffsetActionEncode(pOffsetObj); - sdbSetRawStatus(pOffsetRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pOffsetRaw, SDB_STATUS_READY); mndTransAppendCommitlog(pTrans, pOffsetRaw); if (create) { taosMemoryFree(pOffsetObj); diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index ea889e7001..7ecce6b014 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -406,7 +406,7 @@ int32_t mndPersistStream(SMnode *pMnode, STrans *pTrans, SStreamObj *pStream) { mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr()); return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + (void)(pCommitRaw, SDB_STATUS_READY); return 0; } @@ -417,7 +417,7 @@ int32_t mndPersistDropStreamLog(SMnode *pMnode, STrans *pTrans, SStreamObj *pStr mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED); return 0; } @@ -433,7 +433,7 @@ static int32_t mndSetStreamRecover(SMnode *pMnode, STrans *pTrans, const SStream mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); return 0; } diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index ce195454f8..da971559b2 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -459,7 +459,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq * mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + (void) sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); if (topicObj.ntbUid != 0) { STqCheckInfo info; @@ -596,7 +596,7 @@ static int32_t mndDropTopic(SMnode *pMnode, STrans *pTrans, SRpcMsg *pReq, SMqTo mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED); if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); @@ -777,7 +777,7 @@ static int32_t mndRetrieveTopic(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl int32_t cols = 0; char topicName[TSDB_TOPIC_NAME_LEN + VARSTR_HEADER_SIZE + 5] = {0}; - strcpy(varDataVal(topicName), mndGetDbStr(pTopic->name)); + tstrncpy(varDataVal(topicName), mndGetDbStr(pTopic->name), sizeof(topicName) - 2); /*tNameFromString(&n, pTopic->name, T_NAME_ACCT | T_NAME_DB);*/ /*tNameGetDbName(&n, varDataVal(topicName));*/ varDataSetLen(topicName, strlen(varDataVal(topicName))); diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 455b71ace9..b3ca03b33a 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -435,7 +435,9 @@ _OVER: return NULL; } - mTrace("trans:%d, decode from raw:%p, row:%p", pTrans->id, pRaw, pTrans); + if (pTrans != NULL) { + mTrace("trans:%d, decode from raw:%p, row:%p", pTrans->id, pRaw, pTrans); + } return pRow; } @@ -769,7 +771,7 @@ static int32_t mndTransSync(SMnode *pMnode, STrans *pTrans) { mError("trans:%d, failed to encode while sync trans since %s", pTrans->id, terrstr()); return -1; } - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); mInfo("trans:%d, sync to other mnodes, stage:%s", pTrans->id, mndTransStr(pTrans->stage)); int32_t code = mndSyncPropose(pMnode, pRaw, pTrans->id); @@ -1431,7 +1433,7 @@ static bool mndTransPerfromFinishedStage(SMnode *pMnode, STrans *pTrans) { mError("trans:%d, failed to encode while finish trans since %s", pTrans->id, terrstr()); return false; } - sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_DROPPED); int32_t code = sdbWrite(pMnode->pSdb, pRaw); if (code != 0) { diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index fecdfb12ba..9f4b9fc2de 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -77,7 +77,7 @@ static int32_t mndCreateDefaultUser(SMnode *pMnode, char *acct, char *user, char SSdbRaw *pRaw = mndUserActionEncode(&userObj); if (pRaw == NULL) return -1; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); mInfo("user:%s, will be created when deploying, raw:%p", userObj.user, pRaw); @@ -94,7 +94,7 @@ static int32_t mndCreateDefaultUser(SMnode *pMnode, char *acct, char *user, char mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); @@ -313,7 +313,7 @@ static int32_t mndCreateUser(SMnode *pMnode, char *acct, SCreateUserReq *pCreate mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); @@ -397,7 +397,7 @@ static int32_t mndAlterUser(SMnode *pMnode, SUserObj *pOld, SUserObj *pNew, SRpc mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); @@ -612,7 +612,7 @@ static int32_t mndDropUser(SMnode *pMnode, SRpcMsg *pReq, SUserObj *pUser) { mndTransDrop(pTrans); return -1; } - sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED); if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c index a0f01f41d8..a31bf6b8e2 100644 --- a/source/dnode/mnode/impl/src/mndVgroup.c +++ b/source/dnode/mnode/impl/src/mndVgroup.c @@ -1115,14 +1115,14 @@ int32_t mndSetMoveVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, { SSdbRaw *pRaw = mndVgroupActionEncode(&newVg); if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) return -1; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); pRaw = NULL; } { SSdbRaw *pRaw = mndVgroupActionEncode(&newVg); if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) return -1; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); pRaw = NULL; } @@ -1304,14 +1304,14 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, { pRaw = mndVgroupActionEncode(&newVg); if (pRaw == NULL || mndTransAppendRedolog(pTrans, pRaw) != 0) goto _OVER; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); pRaw = NULL; } { pRaw = mndVgroupActionEncode(&newVg); if (pRaw == NULL || mndTransAppendCommitlog(pTrans, pRaw) != 0) goto _OVER; - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); pRaw = NULL; } @@ -1579,7 +1579,7 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, S sdbFreeRaw(pVgRaw); return -1; } - sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); } { @@ -1589,7 +1589,7 @@ int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, S sdbFreeRaw(pVgRaw); return -1; } - sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pVgRaw, SDB_STATUS_READY); } } @@ -1704,7 +1704,7 @@ static int32_t mndSetBalanceVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SD sdbFreeRaw(pRaw); return -1; } - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); } { @@ -1713,7 +1713,7 @@ static int32_t mndSetBalanceVgroupInfoToTrans(SMnode *pMnode, STrans *pTrans, SD sdbFreeRaw(pRaw); return -1; } - sdbSetRawStatus(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); } mInfo("vgId:%d, vgroup info after balance, replica:%d", newVg.vgId, newVg.replica); diff --git a/source/dnode/mnode/sdb/src/sdbFile.c b/source/dnode/mnode/sdb/src/sdbFile.c index b5cfa7b0f6..3df0fcee17 100644 --- a/source/dnode/mnode/sdb/src/sdbFile.c +++ b/source/dnode/mnode/sdb/src/sdbFile.c @@ -619,8 +619,8 @@ int32_t sdbStopWrite(SSdb *pSdb, SSdbIter *pIter, bool isApply, int64_t index, i int32_t code = 0; if (!isApply) { - sdbCloseIter(pIter); mInfo("sdbiter:%p, not apply to sdb", pIter); + sdbCloseIter(pIter); return 0; } diff --git a/source/util/src/tuuid.c b/source/util/src/tuuid.c index d192b1229d..8652652024 100644 --- a/source/util/src/tuuid.c +++ b/source/util/src/tuuid.c @@ -39,8 +39,8 @@ int32_t tGenIdPI32(void) { int64_t tGenIdPI64(void) { if (tUUIDHashId == 0) { - char uid[64]; - int32_t code = taosGetSystemUUID(uid, tListLen(uid)); + char uid[65] = {0}; + int32_t code = taosGetSystemUUID(uid, 64); if (code != TSDB_CODE_SUCCESS) { terrno = TAOS_SYSTEM_ERROR(errno); } else { diff --git a/utils/tsim/src/simExe.c b/utils/tsim/src/simExe.c index 5bb53287db..4fe5fdf672 100644 --- a/utils/tsim/src/simExe.c +++ b/utils/tsim/src/simExe.c @@ -237,9 +237,9 @@ int32_t simExecuteExpression(SScript *script, char *exp) { int32_t var3Len = 0; int32_t val0 = 0; int32_t val1 = 0; - char t0[1024] = {0}; - char t1[1024] = {0}; - char t2[1024] = {0}; + char t0[2048] = {0}; + char t1[2048] = {0}; + char t2[2048] = {0}; char t3[2048] = {0}; int32_t result = 0; @@ -256,7 +256,7 @@ int32_t simExecuteExpression(SScript *script, char *exp) { } if (var2[0] == '$') { - tstrncpy(t1, simGetVariable(script, var2 + 1, var2Len - 1), 1024); + tstrncpy(t1, simGetVariable(script, var2 + 1, var2Len - 1), sizeof(t1)); } else { memcpy(t1, var2, var2Len); t1[var2Len] = 0; @@ -266,7 +266,7 @@ int32_t simExecuteExpression(SScript *script, char *exp) { rest = paGetToken(rest, &var3, &var3Len); if (var3[0] == '$') - strcpy(t2, simGetVariable(script, var3 + 1, var3Len - 1)); + tstrncpy(t2, simGetVariable(script, var3 + 1, var3Len - 1), sizeof(t2)); else { memcpy(t2, var3, var3Len); t2[var3Len] = 0; @@ -291,7 +291,7 @@ int32_t simExecuteExpression(SScript *script, char *exp) { sprintf(t3, "%s%s", t1, t2); } } else { - strcpy(t3, t1); + tstrncpy(t3, t1, sizeof(t3)); } result = 0; From 3f22971eb43c247c1f5cd8986c307ce0f1ed6117 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Sat, 8 Oct 2022 13:17:06 +0800 Subject: [PATCH 131/143] fix: taosbenchmark stmt + csv rework (#17194) * fix: taosbenchmark stmt + csv rework * test: change default_json.py to align with doc --- cmake/taostools_CMakeLists.txt.in | 2 +- .../taosbenchmark/default_json.py | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index 5d2fcf27b2..2d90d8c49f 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 70f5a1c + GIT_TAG 85179e9 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE diff --git a/tests/develop-test/5-taos-tools/taosbenchmark/default_json.py b/tests/develop-test/5-taos-tools/taosbenchmark/default_json.py index 18b22b51ce..0a835ec564 100644 --- a/tests/develop-test/5-taos-tools/taosbenchmark/default_json.py +++ b/tests/develop-test/5-taos-tools/taosbenchmark/default_json.py @@ -19,10 +19,9 @@ from util.dnodes import * class TDTestCase: def caseDescription(self): - ''' + """ [TD-11510] taosBenchmark test cases - ''' - return + """ def init(self, conn, logSql): tdLog.debug("start to execute %s" % __file__) @@ -31,19 +30,19 @@ class TDTestCase: def getPath(self, tool="taosBenchmark"): selfPath = os.path.dirname(os.path.realpath(__file__)) - if ("community" in selfPath): - projPath = selfPath[:selfPath.find("community")] + if "community" in selfPath: + projPath = selfPath[: selfPath.find("community")] else: - projPath = selfPath[:selfPath.find("tests")] + projPath = selfPath[: selfPath.find("tests")] paths = [] for root, dirs, files in os.walk(projPath): - if ((tool) in files): + if (tool) in files: rootRealPath = os.path.dirname(os.path.realpath(root)) - if ("packaging" not in rootRealPath): + if "packaging" not in rootRealPath: paths.append(os.path.join(root, tool)) break - if (len(paths) == 0): + if len(paths) == 0: tdLog.exit("taosBenchmark not found!") return else: @@ -52,14 +51,15 @@ class TDTestCase: def run(self): binPath = self.getPath() - cmd = "%s -f ./5-taos-tools/taosbenchmark/json/default.json" %binPath + cmd = "%s -f ./5-taos-tools/taosbenchmark/json/default.json" % binPath tdLog.info("%s" % cmd) os.system("%s" % cmd) tdSql.execute("reset query cache") tdSql.query("select count(*) from (select distinct(tbname) from db.stb)") tdSql.checkData(0, 0, 10) tdSql.query("select count(*) from db.stb") - tdSql.checkData(0, 0, 100) + if len(tdSql.queryResult): + tdLog.exit("query result is %d" % len(tdSql.queryResult)) def stop(self): tdSql.close() From d3c4b338935afe60c094ff6461b66df7e330a3ef Mon Sep 17 00:00:00 2001 From: Zhiqiang Wang <1296468573@qq.com> Date: Sat, 8 Oct 2022 13:40:41 +0800 Subject: [PATCH 132/143] doc: change doc about Mac (#17207) * doc: change doc about Mac * docs: fixed few typos Co-authored-by: Shuduo Sang --- README-CN.md | 6 ++--- README.md | 4 ++-- docs/en/05-get-started/03-package.md | 31 +++++++++++++++++++------- docs/zh/05-get-started/03-package.md | 33 ++++++++++++++++++++-------- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/README-CN.md b/README-CN.md index 907e87347d..bcecc689ed 100644 --- a/README-CN.md +++ b/README-CN.md @@ -41,7 +41,7 @@ TDengine 是一款开源、高性能、云原生的时序数据库 (Time-Series TDengine 目前可以在 Linux、 Windows 等平台上安装和运行。任何 OS 的应用也可以选择 taosAdapter 的 RESTful 接口连接服务端 taosd。CPU 支持 X64/ARM64,后续会支持 MIPS64、Alpha64、ARM32、RISC-V 等 CPU 架构。 -用户可根据需求选择通过源码、[容器](https://docs.taosdata.com/get-started/docker/)、[安装包](https://docs.taosdata.com/get-started/package/)或[Kubenetes](https://docs.taosdata.com/deployment/k8s/)来安装。本快速指南仅适用于通过源码安装。 +用户可根据需求选择通过源码、[容器](https://docs.taosdata.com/get-started/docker/)、[安装包](https://docs.taosdata.com/get-started/package/)或[Kubernetes](https://docs.taosdata.com/deployment/k8s/)来安装。本快速指南仅适用于通过源码安装。 TDengine 还提供一组辅助工具软件 taosTools,目前它包含 taosBenchmark(曾命名为 taosdemo)和 taosdump 两个软件。默认 TDengine 编译不包含 taosTools, 您可以在编译 TDengine 时使用`cmake .. -DBUILD_TOOLS=true` 来同时编译 taosTools。 @@ -104,7 +104,7 @@ sudo yum install -y zlib-devel xz-devel snappy-devel jansson jansson-devel pkgco sudo yum config-manager --set-enabled Powertools ``` -### MacOS +### macOS ``` sudo brew install argp-standalone pkgconfig @@ -218,7 +218,7 @@ nmake ### macOS 系统 -安装 Xcode 命令行工具和 cmake. 在 Catalina 和 Big Sur 操作系统上,需要安装 XCode 11.4+ 版本。 +安装 XCode 命令行工具和 cmake. 在 Catalina 和 Big Sur 操作系统上,需要安装 XCode 11.4+ 版本。 ```bash mkdir debug && cd debug diff --git a/README.md b/README.md index 69d7cc13ad..6faf386bd6 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ English | [简体中文](README-CN.md) | [Learn more about TSDB](https://tdengin # What is TDengine? -TDengine is an open source, high-performance, cloud native [time-series database](https://tdengine.com/tsdb/) optimized for Internet of Things (IoT), Connected Cars, and Industrial IoT. It enables efficient, real-time data ingestion, processing, and monitoring of TB and even PB scale data per day, generated by billions of sensors and data collectors. TDengine differentiates itself from other time-seires databases with the following advantages: +TDengine is an open source, high-performance, cloud native [time-series database](https://tdengine.com/tsdb/) optimized for Internet of Things (IoT), Connected Cars, and Industrial IoT. It enables efficient, real-time data ingestion, processing, and monitoring of TB and even PB scale data per day, generated by billions of sensors and data collectors. TDengine differentiates itself from other time-series databases with the following advantages: - **[High Performance](https://tdengine.com/tdengine/high-performance-time-series-database/)**: TDengine is the only time-series database to solve the high cardinality issue to support billions of data collection points while out performing other time-series databases for data ingestion, querying and data compression. @@ -105,7 +105,7 @@ If the PowerTools installation fails, you can try to use: sudo yum config-manager --set-enabled powertools ``` -### MacOS +### macOS ``` sudo brew install argp-standalone pkgconfig diff --git a/docs/en/05-get-started/03-package.md b/docs/en/05-get-started/03-package.md index 328e43c4f7..4dadbb0151 100644 --- a/docs/en/05-get-started/03-package.md +++ b/docs/en/05-get-started/03-package.md @@ -7,7 +7,7 @@ import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import PkgListV3 from "/components/PkgListV3"; -This document describes how to install TDengine on Linux and Windows and perform queries and inserts. +This document describes how to install TDengine on Linux/Windows/macOS and perform queries and inserts. - The easiest way to explore TDengine is through [TDengine Cloud](http://cloud.tdengine.com). - To get started with TDengine on Docker, see [Quick Install on Docker](../../get-started/docker). @@ -17,7 +17,7 @@ The full package of TDengine includes the TDengine Server (`taosd`), TDengine Cl The standard server installation package includes `taos`, `taosd`, `taosAdapter`, `taosBenchmark`, and sample code. You can also download the Lite package that includes only `taosd` and the C/C++ connector. -The TDengine Community Edition is released as Deb and RPM packages. The Deb package can be installed on Debian, Ubuntu, and derivative systems. The RPM package can be installed on CentOS, RHEL, SUSE, and derivative systems. A .tar.gz package is also provided for enterprise customers, and you can install TDengine over `apt-get` as well. The .tar.tz package includes `taosdump` and the TDinsight installation script. If you want to use these utilities with the Deb or RPM package, download and install taosTools separately. TDengine can also be installed on 64-bit Windows. +The TDengine Community Edition is released as Deb and RPM packages. The Deb package can be installed on Debian, Ubuntu, and derivative systems. The RPM package can be installed on CentOS, RHEL, SUSE, and derivative systems. A .tar.gz package is also provided for enterprise customers, and you can install TDengine over `apt-get` as well. The .tar.tz package includes `taosdump` and the TDinsight installation script. If you want to use these utilities with the Deb or RPM package, download and install taosTools separately. TDengine can also be installed on x64 Windows and x64/m1 macOS. ## Installation @@ -112,9 +112,9 @@ Note: TDengine only supports Windows Server 2016/2019 and Windows 10/11 on the W 2. Run the downloaded package to install TDengine. - + -1. Download the Mac installation package. +1. Download the macOS installation package. 2. Run the downloaded package to install TDengine. @@ -187,16 +187,31 @@ After the installation is complete, run `C:\TDengine\taosd.exe` to start TDengin - + After the installation is complete, double-click the /applications/TDengine to start the program, or run `launchctl start taosd` to start TDengine Server. +The following `launchctl` commands can help you manage TDengine service: + +- Start TDengine Server: `launchctl start taosd` + +- Stop TDengine Server: `launchctl stop taosd` + +- Check TDengine Server status: `launchctl list | grep taosd` + +:::info + +- The `launchctl` command does not require _root_ privileges. You don't need to use the `sudo` command. +- The first content returned by the `launchctl list | grep taosd` command is the PID of the program, if '-' indicates that the TDengine service is not running. + +::: + ## Command Line Interface (CLI) -You can use the TDengine CLI to monitor your TDengine deployment and execute ad hoc queries. To open the CLI, you can execute `taos` in the Linux terminal where TDengine is installed, or you can run `taos.exe` in the `C:\TDengine` directory of the Windows terminal where TDengine is installed to start the TDengine command line. +You can use the TDengine CLI to monitor your TDengine deployment and execute ad hoc queries. To open the CLI, you can execute `taos` in the Linux/macOS terminal where TDengine is installed, or you can run `taos.exe` in the `C:\TDengine` directory of the Windows terminal where TDengine is installed to start the TDengine command line. ```bash taos @@ -226,13 +241,13 @@ SELECT * FROM t; Query OK, 2 row(s) in set (0.003128s) ``` -You can also can monitor the deployment status, add and remove user accounts, and manage running instances. You can run the TDengine CLI on either Linux or Windows machines. For more information, see [TDengine CLI](../../reference/taos-shell/). +You can also can monitor the deployment status, add and remove user accounts, and manage running instances. You can run the TDengine CLI on either machines. For more information, see [TDengine CLI](../../reference/taos-shell/). ## Test data insert performance After your TDengine Server is running normally, you can run the taosBenchmark utility to test its performance: -Start TDengine service and execute `taosBenchmark` (formerly named `taosdemo`) in a Linux or Windows terminal. +Start TDengine service and execute `taosBenchmark` (formerly named `taosdemo`) in a terminal. ```bash taosBenchmark diff --git a/docs/zh/05-get-started/03-package.md b/docs/zh/05-get-started/03-package.md index cec430accf..50ee721386 100644 --- a/docs/zh/05-get-started/03-package.md +++ b/docs/zh/05-get-started/03-package.md @@ -10,11 +10,11 @@ import PkgListV3 from "/components/PkgListV3"; 您可以[用 Docker 立即体验](../../get-started/docker/) TDengine。如果您希望对 TDengine 贡献代码或对内部实现感兴趣,请参考我们的 [TDengine GitHub 主页](https://github.com/taosdata/TDengine) 下载源码构建和安装. -TDengine 完整的软件包包括服务端(taosd)、应用驱动(taosc)、用于与第三方系统对接并提供 RESTful 接口的 taosAdapter、命令行程序(CLI,taos)和一些工具软件。目前 taosAdapter 仅在 Linux 系统上安装和运行,后续将支持 Windows、macOS 等系统。TDengine 除了提供多种语言的连接器之外,还通过 [taosAdapter](../../reference/taosadapter/) 提供 [RESTful 接口](../../connector/rest-api/)。 +TDengine 完整的软件包包括服务端(taosd)、应用驱动(taosc)、用于与第三方系统对接并提供 RESTful 接口的 taosAdapter、命令行程序(CLI,taos)和一些工具软件。目前 taosdump、TDinsight 仅在 Linux 系统上安装和运行,后续将支持 Windows、macOS 等系统。TDengine 除了提供多种语言的连接器之外,还通过 [taosAdapter](../../reference/taosadapter/) 提供 [RESTful 接口](../../connector/rest-api/)。 为方便使用,标准的服务端安装包包含了 taosd、taosAdapter、taosc、taos、taosdump、taosBenchmark、TDinsight 安装脚本和示例代码;如果您只需要用到服务端程序和客户端连接的 C/C++ 语言支持,也可以仅下载 Lite 版本的安装包。 -在 Linux 系统上,TDengine 社区版提供 Deb 和 RPM 格式安装包,用户可以根据自己的运行环境选择合适的安装包。其中 Deb 支持 Debian/Ubuntu 及其衍生系统,RPM 支持 CentOS/RHEL/SUSE 及其衍生系统。同时我们也为企业用户提供 tar.gz 格式安装包,也支持通过 `apt-get` 工具从线上进行安装。需要注意的是,RPM 和 Deb 包不含 `taosdump` 和 TDinsight 安装脚本,这些工具需要通过安装 taosTool 包获得。TDengine 也提供 Windows x64 平台的安装包。 +在 Linux 系统上,TDengine 社区版提供 Deb 和 RPM 格式安装包,用户可以根据自己的运行环境选择合适的安装包。其中 Deb 支持 Debian/Ubuntu 及其衍生系统,RPM 支持 CentOS/RHEL/SUSE 及其衍生系统。同时我们也为企业用户提供 tar.gz 格式安装包,也支持通过 `apt-get` 工具从线上进行安装。需要注意的是,RPM 和 Deb 包不含 `taosdump` 和 TDinsight 安装脚本,这些工具需要通过安装 taosTools 包获得。TDengine 也提供 Windows x64 平台和 macOS x64/m1 平台的安装包。 ## 安装 @@ -111,7 +111,7 @@ apt-get 方式只适用于 Debian 或 Ubuntu 系统。 2. 运行可执行程序来安装 TDengine。 - + 1. 从列表中下载获得 pkg 安装程序; @@ -186,16 +186,31 @@ Active: inactive (dead) - + -安装后,在应用程序目录下,双击 TDengine 来启动程序,也可以运行 `launchctl start taosd` 来启动 TDengine 服务进程。 +安装后,在应用程序目录下,双击 TDengine 图标来启动程序,也可以运行 `launchctl start taosd` 来启动 TDengine 服务进程。 + +如下 `launchctl` 命令可以帮助你管理 TDengine 服务: + +- 启动服务进程:`launchctl start taosd` + +- 停止服务进程:`launchctl stop taosd` + +- 查看服务状态:`launchctl list | grep taosd` + +:::info + +- `launchctl` 命令不需要管理员权限,请不要在前面加 `sudo`。 +- `launchctl list | grep taosd` 指令返回的第一个内容是程序的 PID,若为 `-` 则说明 TDengine 服务未运行。 + +::: ## TDengine 命令行(CLI) -为便于检查 TDengine 的状态,执行数据库(Database)的各种即席(Ad Hoc)查询,TDengine 提供一命令行应用程序(以下简称为 TDengine CLI)taos。要进入 TDengine 命令行,您只要在安装有 TDengine 的 Linux 终端执行 `taos` 即可,也可以在安装有 TDengine 的 Windows 终端的 C:\TDengine 目录下,运行 taos.exe 来启动 TDengine 命令行。 +为便于检查 TDengine 的状态,执行数据库(Database)的各种即席(Ad Hoc)查询,TDengine 提供一命令行应用程序(以下简称为 TDengine CLI)taos。要进入 TDengine 命令行,您只要在安装有 TDengine 的 Linux、macOS 终端执行 `taos` 即可,也可以在安装有 TDengine 的 Windows 终端的 C:\TDengine 目录下,运行 taos.exe 来启动 TDengine 命令行。 ```bash taos @@ -225,13 +240,13 @@ SELECT * FROM t; Query OK, 2 row(s) in set (0.003128s) ``` -除执行 SQL 语句外,系统管理员还可以从 TDengine CLI 进行检查系统运行状态、添加删除用户账号等操作。TDengine CLI 连同应用驱动也可以独立安装在 Linux 或 Windows 机器上运行,更多细节请参考 [TDengine 命令行](../../reference/taos-shell/)。 +除执行 SQL 语句外,系统管理员还可以从 TDengine CLI 进行检查系统运行状态、添加删除用户账号等操作。TDengine CLI 连同应用驱动也可以独立安装在机器上运行,更多细节请参考 [TDengine 命令行](../../reference/taos-shell/)。 ## 使用 taosBenchmark 体验写入速度 可以使用 TDengine 的自带工具 taosBenchmark 快速体验 TDengine 的写入速度。 -启动 TDengine 的服务,在 Linux 或 Windows 终端执行 `taosBenchmark`(曾命名为 `taosdemo`): +启动 TDengine 服务,然后在终端执行 `taosBenchmark`(曾命名为 `taosdemo`): ```bash $ taosBenchmark @@ -262,7 +277,7 @@ SELECT AVG(current), MAX(voltage), MIN(phase) FROM test.meters; 查询 location = "California.SanFrancisco" 的记录总条数: ```sql -SELECT COUNT(*) FROM test.meters WHERE location = "Calaifornia.SanFrancisco"; +SELECT COUNT(*) FROM test.meters WHERE location = "California.SanFrancisco"; ``` 查询 groupId = 10 的所有记录的平均值、最大值、最小值等: From 2e5eac4b4c7918d41618362ef4cd3215c92a156c Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sat, 8 Oct 2022 13:53:10 +0800 Subject: [PATCH 133/143] fix: coverity issues --- source/dnode/mnode/impl/src/mndDb.c | 2 +- source/dnode/mnode/impl/src/mndTopic.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 5f158f0f91..38c26eb2d9 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -956,7 +956,7 @@ static int32_t mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pD sdbRelease(pSdb, pStbRaw); return -1; } - (void)(pStbRaw, SDB_STATUS_DROPPED); + (void)sdbSetRawStatus(pStbRaw, SDB_STATUS_DROPPED); } sdbRelease(pSdb, pStb); diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index da971559b2..5d3a2be79a 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -459,7 +459,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq * mndTransDrop(pTrans); return -1; } - (void) sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); if (topicObj.ntbUid != 0) { STqCheckInfo info; From ffadc1c550bdf2fc5277161b72af497ef1950727 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sat, 8 Oct 2022 14:36:54 +0800 Subject: [PATCH 134/143] fix: coverity issues --- source/dnode/mnode/impl/src/mndDb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 38c26eb2d9..9f0cb0b510 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -1052,7 +1052,7 @@ static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) { mError("trans:%d, failed to append redo log since %s", pTrans->id, terrstr()); goto _OVER; } - (void)(pCommitRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); } int32_t rspLen = 0; From 0777160924e64e593ded0f1d23f8b64da53ef318 Mon Sep 17 00:00:00 2001 From: plum-lihui Date: Sat, 8 Oct 2022 16:05:08 +0800 Subject: [PATCH 135/143] test:modify timeout from 5s to 10s --- tests/system-test/7-tmq/tmqDnodeRestart.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system-test/7-tmq/tmqDnodeRestart.py b/tests/system-test/7-tmq/tmqDnodeRestart.py index 1902945bf6..bcc6725848 100644 --- a/tests/system-test/7-tmq/tmqDnodeRestart.py +++ b/tests/system-test/7-tmq/tmqDnodeRestart.py @@ -64,7 +64,7 @@ class TDTestCase: ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"], startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) - tdLog.info("restart taosd to ensure that the data falls into the disk") + tdLog.info("flush database to ensure that the data falls into the disk") # tdDnodes.stop(1) # tdDnodes.start(1) tdSql.query("flush database %s"%(paraDict['dbName'])) @@ -87,7 +87,7 @@ class TDTestCase: 'rowsPerTbl': 1000, 'batchNum': 100, 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 - 'pollDelay': 5, + 'pollDelay': 10, 'showMsg': 1, 'showRow': 1, 'snapshot': 0} From ec74aa6621a573950ef2ecbe70ec6bc851eb1104 Mon Sep 17 00:00:00 2001 From: songshuqi <35394385+ssq001@users.noreply.github.com> Date: Sat, 8 Oct 2022 16:43:48 +0800 Subject: [PATCH 136/143] Update 06-stream.md --- docs/zh/07-develop/06-stream.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/07-develop/06-stream.md b/docs/zh/07-develop/06-stream.md index c9f1b1d43a..a2e1d1a1da 100644 --- a/docs/zh/07-develop/06-stream.md +++ b/docs/zh/07-develop/06-stream.md @@ -70,7 +70,7 @@ insert into d1004 values("2018-10-03 14:38:06.500", 11.50000, 221, 0.35000); ### 查询以观察结果 ```sql -taos> select start, end, max_current from current_stream_output_stb; +taos> select start, wend, max_current from current_stream_output_stb; start | wend | max_current | =========================================================================== 2018-10-03 14:38:05.000 | 2018-10-03 14:38:10.000 | 10.30000 | From 4e65accad2234659bef7329cc1dc30ec0799e2c3 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sat, 8 Oct 2022 17:02:34 +0800 Subject: [PATCH 137/143] fix: coverity issues --- source/dnode/mnode/impl/src/mndStream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c index 7ecce6b014..70e134a088 100644 --- a/source/dnode/mnode/impl/src/mndStream.c +++ b/source/dnode/mnode/impl/src/mndStream.c @@ -406,7 +406,7 @@ int32_t mndPersistStream(SMnode *pMnode, STrans *pTrans, SStreamObj *pStream) { mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr()); return -1; } - (void)(pCommitRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); return 0; } From 2210bc2205dcb6553c10de8aaa8c6e1eb83265dd Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sat, 8 Oct 2022 17:06:29 +0800 Subject: [PATCH 138/143] fix: coverity issues --- source/dnode/mnode/impl/src/mndCluster.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndCluster.c b/source/dnode/mnode/impl/src/mndCluster.c index 86df286e2a..348c8f4cb8 100644 --- a/source/dnode/mnode/impl/src/mndCluster.c +++ b/source/dnode/mnode/impl/src/mndCluster.c @@ -231,7 +231,7 @@ static int32_t mndCreateDefaultCluster(SMnode *pMnode) { SSdbRaw *pRaw = mndClusterActionEncode(&clusterObj); if (pRaw == NULL) return -1; - (void)(pRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); mInfo("cluster:%" PRId64 ", will be created when deploying, raw:%p", clusterObj.id, pRaw); @@ -326,7 +326,7 @@ static int32_t mndProcessUptimeTimer(SRpcMsg *pReq) { mndTransDrop(pTrans); return -1; } - (void)(pCommitRaw, SDB_STATUS_READY); + (void)sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY); if (mndTransPrepare(pMnode, pTrans) != 0) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); From 7f44649b8d18de69e5c1d0f8f8f9d6533075c8fa Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 8 Oct 2022 17:40:02 +0800 Subject: [PATCH 139/143] update doc --- docs/zh/12-taos-sql/12-distinguished.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/zh/12-taos-sql/12-distinguished.md b/docs/zh/12-taos-sql/12-distinguished.md index 861ef4ebb7..5b63628e8d 100644 --- a/docs/zh/12-taos-sql/12-distinguished.md +++ b/docs/zh/12-taos-sql/12-distinguished.md @@ -4,9 +4,9 @@ title: 特色查询 description: TDengine 提供的时序数据特有的查询功能 --- -TDengine 是专为时序数据而研发的大数据平台,存储和计算都针对时序数据的特定进行了量身定制,在支持标准 SQL 的基础之上,还提供了一系列贴合时序业务场景的特色查询语法,极大的方便时序场景的应用开发。 +TDengine 在支持标准 SQL 的基础之上,还提供了一系列满足时序业务场景需求的特色查询语法,这些语法能够为时序场景的应用的开发带来极大的便利。 -TDengine 提供的特色查询包括数据切分查询和窗口切分查询。 +TDengine 提供的特色查询包括数据切分查询和时间窗口切分查询。 ## 数据切分查询 @@ -31,7 +31,7 @@ select max(current) from meters partition by location interval(10m) ## 窗口切分查询 -TDengine 支持按时间段窗口切分方式进行聚合结果查询,比如温度传感器每秒采集一次数据,但需查询每隔 10 分钟的温度平均值。这种场景下可以使用窗口子句来获得需要的查询结果。窗口子句用于针对查询的数据集合按照窗口切分成为查询子集并进行聚合,窗口包含时间窗口(time window)、状态窗口(status window)、会话窗口(session window)三种窗口。其中时间窗口又可划分为滑动时间窗口和翻转时间窗口。窗口切分查询语法如下: +TDengine 支持按时间窗口切分方式进行聚合结果查询,比如温度传感器每秒采集一次数据,但需查询每隔 10 分钟的温度平均值。这种场景下可以使用窗口子句来获得需要的查询结果。窗口子句用于针对查询的数据集合按照窗口切分成为查询子集并进行聚合,窗口包含时间窗口(time window)、状态窗口(status window)、会话窗口(session window)三种窗口。其中时间窗口又可划分为滑动时间窗口和翻转时间窗口。窗口切分查询语法如下: ```sql SELECT select_list FROM tb_name @@ -132,6 +132,10 @@ SELECT * FROM (SELECT COUNT(*) AS cnt, FIRST(ts) AS fst, status FROM temp_tb_1 S SELECT COUNT(*), FIRST(ts) FROM temp_tb_1 SESSION(ts, tol_val); ``` +### 时间戳伪列 + +窗口聚合查询结果中,如果 SQL 语句中没有指定输出查询结果中的时间戳列,那么最终结果中不会自动包含窗口的时间列信息。如果需要在结果中输出聚合结果所对应的时间窗口信息,需要在 SELECT 子句中使用时间戳相关的伪列: 时间窗口起始时间 (_WSTART), 时间窗口结束时间 (_WEND), 时间窗口持续时间 (_WDURATION), 以及查询整体窗口相关的伪列: 查询窗口起始时间(_QSTART) 和查询窗口结束时间(_QEND)。需要注意的是时间窗口起始时间和结束时间均是闭区间,时间窗口持续时间是数据当前时间分辨率下的数值。例如,如果当前数据库的时间分辨率是毫秒,那么结果中 500 就表示当前时间窗口是 500毫秒 (500 ms)。 + ### 示例 智能电表的建表语句如下: @@ -143,8 +147,10 @@ CREATE TABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS 针对智能电表采集的数据,以 10 分钟为一个阶段,计算过去 24 小时的电流数据的平均值、最大值、电流的中位数。如果没有计算值,用前一个非 NULL 值填充。使用的查询语句如下: ``` -SELECT AVG(current), MAX(current), APERCENTILE(current, 50) FROM meters +SELECT _WSTART, _WEND, AVG(current), MAX(current), APERCENTILE(current, 50) FROM meters WHERE ts>=NOW-1d and ts<=now INTERVAL(10m) FILL(PREV); ``` + + From 5230c16153f4c18a415859b033377ba6f5437a3a Mon Sep 17 00:00:00 2001 From: songshuqi <35394385+ssq001@users.noreply.github.com> Date: Sat, 8 Oct 2022 17:42:33 +0800 Subject: [PATCH 140/143] Update 02-rest-api.mdx (#17221) --- docs/zh/08-connector/02-rest-api.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/08-connector/02-rest-api.mdx b/docs/zh/08-connector/02-rest-api.mdx index a8e1682301..68d73ff32f 100644 --- a/docs/zh/08-connector/02-rest-api.mdx +++ b/docs/zh/08-connector/02-rest-api.mdx @@ -74,7 +74,7 @@ http://:/rest/sql/[db_name] 参数说明: -- fqnd: 集群中的任一台主机 FQDN 或 IP 地址。 +- fqdn: 集群中的任一台主机 FQDN 或 IP 地址。 - port: 配置文件中 httpPort 配置项,缺省为 6041。 - db_name: 可选参数,指定本次所执行的 SQL 语句的默认数据库库名。 From 26363673376bffd0c959e7de7f30dbe8562bba54 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 8 Oct 2022 17:43:16 +0800 Subject: [PATCH 141/143] update docs --- docs/zh/12-taos-sql/12-distinguished.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/12-taos-sql/12-distinguished.md b/docs/zh/12-taos-sql/12-distinguished.md index 5b63628e8d..ee8e8e15ca 100644 --- a/docs/zh/12-taos-sql/12-distinguished.md +++ b/docs/zh/12-taos-sql/12-distinguished.md @@ -134,7 +134,7 @@ SELECT COUNT(*), FIRST(ts) FROM temp_tb_1 SESSION(ts, tol_val); ### 时间戳伪列 -窗口聚合查询结果中,如果 SQL 语句中没有指定输出查询结果中的时间戳列,那么最终结果中不会自动包含窗口的时间列信息。如果需要在结果中输出聚合结果所对应的时间窗口信息,需要在 SELECT 子句中使用时间戳相关的伪列: 时间窗口起始时间 (_WSTART), 时间窗口结束时间 (_WEND), 时间窗口持续时间 (_WDURATION), 以及查询整体窗口相关的伪列: 查询窗口起始时间(_QSTART) 和查询窗口结束时间(_QEND)。需要注意的是时间窗口起始时间和结束时间均是闭区间,时间窗口持续时间是数据当前时间分辨率下的数值。例如,如果当前数据库的时间分辨率是毫秒,那么结果中 500 就表示当前时间窗口是 500毫秒 (500 ms)。 +窗口聚合查询结果中,如果 SQL 语句中没有指定输出查询结果中的时间戳列,那么最终结果中不会自动包含窗口的时间列信息。如果需要在结果中输出聚合结果所对应的时间窗口信息,需要在 SELECT 子句中使用时间戳相关的伪列: 时间窗口起始时间 (\_WSTART), 时间窗口结束时间 (\_WEND), 时间窗口持续时间 (\_WDURATION), 以及查询整体窗口相关的伪列: 查询窗口起始时间(\_QSTART) 和查询窗口结束时间(\_QEND)。需要注意的是时间窗口起始时间和结束时间均是闭区间,时间窗口持续时间是数据当前时间分辨率下的数值。例如,如果当前数据库的时间分辨率是毫秒,那么结果中 500 就表示当前时间窗口的持续时间是 500毫秒 (500 ms)。 ### 示例 From 4b92876f8c4ff9b4a5747ab7dadc5f521b3bfa44 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Sat, 8 Oct 2022 18:08:26 +0800 Subject: [PATCH 142/143] fix: continue execute transactions after taosd restart --- source/dnode/mnode/impl/src/mndTrans.c | 61 +++++++++++++------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 455b71ace9..995fe5171a 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -17,9 +17,9 @@ #include "mndTrans.h" #include "mndConsumer.h" #include "mndDb.h" -#include "mndStb.h" #include "mndPrivilege.h" #include "mndShow.h" +#include "mndStb.h" #include "mndSync.h" #include "mndUser.h" @@ -138,6 +138,7 @@ static SSdbRaw *mndTransActionEncode(STrans *pTrans) { SDB_SET_INT32(pRaw, dataPos, undoActionNum, _OVER) SDB_SET_INT32(pRaw, dataPos, commitActionNum, _OVER) + int8_t unused = 0; for (int32_t i = 0; i < redoActionNum; ++i) { STransAction *pAction = taosArrayGet(pTrans->redoActions, i); SDB_SET_INT32(pRaw, dataPos, pAction->id, _OVER) @@ -149,14 +150,14 @@ static SSdbRaw *mndTransActionEncode(STrans *pTrans) { SDB_SET_INT8(pRaw, dataPos, pAction->reserved, _OVER) if (pAction->actionType == TRANS_ACTION_RAW) { int32_t len = sdbGetRawTotalSize(pAction->pRaw); - SDB_SET_INT8(pRaw, dataPos, pAction->rawWritten, _OVER) + SDB_SET_INT8(pRaw, dataPos, unused /*pAction->rawWritten*/, _OVER) SDB_SET_INT32(pRaw, dataPos, len, _OVER) SDB_SET_BINARY(pRaw, dataPos, (void *)pAction->pRaw, len, _OVER) } else if (pAction->actionType == TRANS_ACTION_MSG) { SDB_SET_BINARY(pRaw, dataPos, (void *)&pAction->epSet, sizeof(SEpSet), _OVER) SDB_SET_INT16(pRaw, dataPos, pAction->msgType, _OVER) - SDB_SET_INT8(pRaw, dataPos, pAction->msgSent, _OVER) - SDB_SET_INT8(pRaw, dataPos, pAction->msgReceived, _OVER) + SDB_SET_INT8(pRaw, dataPos, unused /*pAction->msgSent*/, _OVER) + SDB_SET_INT8(pRaw, dataPos, unused /*pAction->msgReceived*/, _OVER) SDB_SET_INT32(pRaw, dataPos, pAction->contLen, _OVER) SDB_SET_BINARY(pRaw, dataPos, pAction->pCont, pAction->contLen, _OVER) } else { @@ -175,14 +176,14 @@ static SSdbRaw *mndTransActionEncode(STrans *pTrans) { SDB_SET_INT8(pRaw, dataPos, pAction->reserved, _OVER) if (pAction->actionType == TRANS_ACTION_RAW) { int32_t len = sdbGetRawTotalSize(pAction->pRaw); - SDB_SET_INT8(pRaw, dataPos, pAction->rawWritten, _OVER) + SDB_SET_INT8(pRaw, dataPos, unused /*pAction->rawWritten*/, _OVER) SDB_SET_INT32(pRaw, dataPos, len, _OVER) SDB_SET_BINARY(pRaw, dataPos, (void *)pAction->pRaw, len, _OVER) } else if (pAction->actionType == TRANS_ACTION_MSG) { SDB_SET_BINARY(pRaw, dataPos, (void *)&pAction->epSet, sizeof(SEpSet), _OVER) SDB_SET_INT16(pRaw, dataPos, pAction->msgType, _OVER) - SDB_SET_INT8(pRaw, dataPos, pAction->msgSent, _OVER) - SDB_SET_INT8(pRaw, dataPos, pAction->msgReceived, _OVER) + SDB_SET_INT8(pRaw, dataPos, unused /*pAction->msgSent*/, _OVER) + SDB_SET_INT8(pRaw, dataPos, unused /*pAction->msgReceived*/, _OVER) SDB_SET_INT32(pRaw, dataPos, pAction->contLen, _OVER) SDB_SET_BINARY(pRaw, dataPos, pAction->pCont, pAction->contLen, _OVER) } else { @@ -201,14 +202,14 @@ static SSdbRaw *mndTransActionEncode(STrans *pTrans) { SDB_SET_INT8(pRaw, dataPos, pAction->reserved, _OVER) if (pAction->actionType == TRANS_ACTION_RAW) { int32_t len = sdbGetRawTotalSize(pAction->pRaw); - SDB_SET_INT8(pRaw, dataPos, pAction->rawWritten, _OVER) + SDB_SET_INT8(pRaw, dataPos, unused /*pAction->rawWritten*/, _OVER) SDB_SET_INT32(pRaw, dataPos, len, _OVER) SDB_SET_BINARY(pRaw, dataPos, (void *)pAction->pRaw, len, _OVER) } else if (pAction->actionType == TRANS_ACTION_MSG) { SDB_SET_BINARY(pRaw, dataPos, (void *)&pAction->epSet, sizeof(SEpSet), _OVER) SDB_SET_INT16(pRaw, dataPos, pAction->msgType, _OVER) - SDB_SET_INT8(pRaw, dataPos, pAction->msgSent, _OVER) - SDB_SET_INT8(pRaw, dataPos, pAction->msgReceived, _OVER) + SDB_SET_INT8(pRaw, dataPos, unused /*pAction->msgSent*/, _OVER) + SDB_SET_INT8(pRaw, dataPos, unused /*pAction->msgReceived*/, _OVER) SDB_SET_INT32(pRaw, dataPos, pAction->contLen, _OVER) SDB_SET_BINARY(pRaw, dataPos, pAction->pCont, pAction->contLen, _OVER) } else { @@ -305,6 +306,7 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { if (pTrans->undoActions == NULL) goto _OVER; if (pTrans->commitActions == NULL) goto _OVER; + int8_t unused = 0; for (int32_t i = 0; i < redoActionNum; ++i) { memset(&action, 0, sizeof(action)); SDB_GET_INT32(pRaw, dataPos, &action.id, _OVER) @@ -317,7 +319,7 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { action.stage = stage; SDB_GET_INT8(pRaw, dataPos, &action.reserved, _OVER) if (action.actionType == TRANS_ACTION_RAW) { - SDB_GET_INT8(pRaw, dataPos, &action.rawWritten, _OVER) + SDB_GET_INT8(pRaw, dataPos, &unused /*&action.rawWritten*/, _OVER) SDB_GET_INT32(pRaw, dataPos, &dataLen, _OVER) action.pRaw = taosMemoryMalloc(dataLen); if (action.pRaw == NULL) goto _OVER; @@ -328,8 +330,8 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { } else if (action.actionType == TRANS_ACTION_MSG) { SDB_GET_BINARY(pRaw, dataPos, (void *)&action.epSet, sizeof(SEpSet), _OVER); SDB_GET_INT16(pRaw, dataPos, &action.msgType, _OVER) - SDB_GET_INT8(pRaw, dataPos, &action.msgSent, _OVER) - SDB_GET_INT8(pRaw, dataPos, &action.msgReceived, _OVER) + SDB_GET_INT8(pRaw, dataPos, &unused /*&action.msgSent*/, _OVER) + SDB_GET_INT8(pRaw, dataPos, &unused /*&action.msgReceived*/, _OVER) SDB_GET_INT32(pRaw, dataPos, &action.contLen, _OVER) action.pCont = taosMemoryMalloc(action.contLen); if (action.pCont == NULL) goto _OVER; @@ -353,7 +355,7 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { action.stage = stage; SDB_GET_INT8(pRaw, dataPos, &action.reserved, _OVER) if (action.actionType == TRANS_ACTION_RAW) { - SDB_GET_INT8(pRaw, dataPos, &action.rawWritten, _OVER) + SDB_GET_INT8(pRaw, dataPos, &unused /*&action.rawWritten*/, _OVER) SDB_GET_INT32(pRaw, dataPos, &dataLen, _OVER) action.pRaw = taosMemoryMalloc(dataLen); if (action.pRaw == NULL) goto _OVER; @@ -364,8 +366,8 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { } else if (action.actionType == TRANS_ACTION_MSG) { SDB_GET_BINARY(pRaw, dataPos, (void *)&action.epSet, sizeof(SEpSet), _OVER); SDB_GET_INT16(pRaw, dataPos, &action.msgType, _OVER) - SDB_GET_INT8(pRaw, dataPos, &action.msgSent, _OVER) - SDB_GET_INT8(pRaw, dataPos, &action.msgReceived, _OVER) + SDB_GET_INT8(pRaw, dataPos, &unused /*&action.msgSent*/, _OVER) + SDB_GET_INT8(pRaw, dataPos, &unused /*&action.msgReceived*/, _OVER) SDB_GET_INT32(pRaw, dataPos, &action.contLen, _OVER) action.pCont = taosMemoryMalloc(action.contLen); if (action.pCont == NULL) goto _OVER; @@ -389,7 +391,7 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { action.stage = stage; SDB_GET_INT8(pRaw, dataPos, &action.reserved, _OVER) if (action.actionType) { - SDB_GET_INT8(pRaw, dataPos, &action.rawWritten, _OVER) + SDB_GET_INT8(pRaw, dataPos, &unused /*&action.rawWritten*/, _OVER) SDB_GET_INT32(pRaw, dataPos, &dataLen, _OVER) action.pRaw = taosMemoryMalloc(dataLen); if (action.pRaw == NULL) goto _OVER; @@ -400,8 +402,8 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) { } else if (action.actionType == TRANS_ACTION_MSG) { SDB_GET_BINARY(pRaw, dataPos, (void *)&action.epSet, sizeof(SEpSet), _OVER); SDB_GET_INT16(pRaw, dataPos, &action.msgType, _OVER) - SDB_GET_INT8(pRaw, dataPos, &action.msgSent, _OVER) - SDB_GET_INT8(pRaw, dataPos, &action.msgReceived, _OVER) + SDB_GET_INT8(pRaw, dataPos, &unused /*&action.msgSent*/, _OVER) + SDB_GET_INT8(pRaw, dataPos, &unused /*&action.msgReceived*/, _OVER) SDB_GET_INT32(pRaw, dataPos, &action.contLen, _OVER) action.pCont = taosMemoryMalloc(action.contLen); if (action.pCont == NULL) goto _OVER; @@ -816,7 +818,7 @@ static bool mndCheckTransConflict(SMnode *pMnode, STrans *pNew) { if (mndCheckDbConflict(pNew->stbname, pTrans)) conflict = true; } if (pTrans->conflict == TRN_CONFLICT_DB_INSIDE) { - if (mndCheckDbConflict(pNew->stbname, pTrans)) conflict = true; // for stb + if (mndCheckDbConflict(pNew->stbname, pTrans)) conflict = true; // for stb } } @@ -825,9 +827,8 @@ static bool mndCheckTransConflict(SMnode *pMnode, STrans *pNew) { pNew->id, pNew->dbname, pNew->stbname, pNew->conflict, pTrans->id, pTrans->dbname, pTrans->stbname, pTrans->conflict); } else { - mInfo("trans:%d, db:%s stb:%s type:%d, not conflict with trans:%d db:%s stb:%s type:%d", pNew->id, - pNew->dbname, pNew->stbname, pNew->conflict, pTrans->id, pTrans->dbname, pTrans->stbname, - pTrans->conflict); + mInfo("trans:%d, db:%s stb:%s type:%d, not conflict with trans:%d db:%s stb:%s type:%d", pNew->id, pNew->dbname, + pNew->stbname, pNew->conflict, pTrans->id, pTrans->dbname, pTrans->stbname, pTrans->conflict); } sdbRelease(pMnode->pSdb, pTrans); } @@ -930,7 +931,7 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) { SRpcHandleInfo *pInfo = taosArrayGet(pTrans->pRpcArray, i); if (pInfo->handle != NULL) { mInfo("trans:%d, send rsp, code:0x%x stage:%s app:%p", pTrans->id, code, mndTransStr(pTrans->stage), - pInfo->ahandle); + pInfo->ahandle); if (code == TSDB_CODE_RPC_NETWORK_UNAVAIL) { code = TSDB_CODE_MND_TRANS_NETWORK_UNAVAILL; } @@ -1013,8 +1014,8 @@ int32_t mndTransProcessRsp(SRpcMsg *pRsp) { pAction->errCode = pRsp->code; } - mInfo("trans:%d, %s:%d response is received, code:0x%x, accept:0x%x retry:0x%x", transId, - mndTransStr(pAction->stage), action, pRsp->code, pAction->acceptableCode, pAction->retryCode); + mInfo("trans:%d, %s:%d response is received, code:0x%x, accept:0x%x retry:0x%x", transId, mndTransStr(pAction->stage), + action, pRsp->code, pAction->acceptableCode, pAction->retryCode); mndTransExecute(pMnode, pTrans); _OVER: @@ -1030,7 +1031,7 @@ static void mndTransResetAction(SMnode *pMnode, STrans *pTrans, STransAction *pA pAction->errCode == TSDB_CODE_SYN_INTERNAL_ERROR || pAction->errCode == TSDB_CODE_SYN_NOT_LEADER) { pAction->epSet.inUse = (pAction->epSet.inUse + 1) % pAction->epSet.numOfEps; mInfo("trans:%d, %s:%d execute status is reset and set epset inuse:%d", pTrans->id, mndTransStr(pAction->stage), - pAction->id, pAction->epSet.inUse); + pAction->id, pAction->epSet.inUse); } else { mInfo("trans:%d, %s:%d execute status is reset", pTrans->id, mndTransStr(pAction->stage), pAction->id); } @@ -1060,7 +1061,7 @@ static int32_t mndTransWriteSingleLog(SMnode *pMnode, STrans *pTrans, STransActi pAction->errCode = 0; code = 0; mInfo("trans:%d, %s:%d write to sdb, type:%s status:%s", pTrans->id, mndTransStr(pAction->stage), pAction->id, - sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); + sdbTableName(pAction->pRaw->type), sdbStatusName(pAction->pRaw->status)); mndSetTransLastAction(pTrans, pAction); } else { @@ -1261,7 +1262,7 @@ static int32_t mndTransExecuteRedoActionsSerial(SMnode *pMnode, STrans *pTrans) pTrans->code = 0; pTrans->redoActionPos++; mInfo("trans:%d, %s:%d is executed and need sync to other mnodes", pTrans->id, mndTransStr(pAction->stage), - pAction->id); + pAction->id); code = mndTransSync(pMnode, pTrans); if (code != 0) { pTrans->code = terrno; @@ -1280,7 +1281,7 @@ static int32_t mndTransExecuteRedoActionsSerial(SMnode *pMnode, STrans *pTrans) terrno = code; pTrans->code = code; mInfo("trans:%d, %s:%d receive code:0x%x and wait another schedule, failedTimes:%d", pTrans->id, - mndTransStr(pAction->stage), pAction->id, code, pTrans->failedTimes); + mndTransStr(pAction->stage), pAction->id, code, pTrans->failedTimes); break; } } From d110650a997b81cff817ffc5d73acea37388fb09 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Sat, 8 Oct 2022 19:04:42 +0800 Subject: [PATCH 143/143] fix: remove fetch thread config --- docs/en/12-taos-sql/06-select.md | 5 ++++- docs/zh/12-taos-sql/06-select.md | 5 ++++- source/common/src/tglobal.c | 10 +++++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/en/12-taos-sql/06-select.md b/docs/en/12-taos-sql/06-select.md index c065245827..570defe1a7 100644 --- a/docs/en/12-taos-sql/06-select.md +++ b/docs/en/12-taos-sql/06-select.md @@ -11,7 +11,7 @@ SELECT {DATABASE() | CLIENT_VERSION() | SERVER_VERSION() | SERVER_STATUS() | NOW SELECT [DISTINCT] select_list from_clause [WHERE condition] - [PARTITION BY tag_list] + [partition_by_clause] [window_clause] [group_by_clause] [order_by_clasue] @@ -52,6 +52,9 @@ window_clause: { | STATE_WINDOW(col) | INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_val)] [WATERMARK(watermark_val)] [FILL(fill_mod_and_val)] +partition_by_clause: + PARTITION BY expr [, expr] ... + group_by_clause: GROUP BY expr [, expr] ... HAVING condition diff --git a/docs/zh/12-taos-sql/06-select.md b/docs/zh/12-taos-sql/06-select.md index b3b8ef3887..3ffc081cd7 100644 --- a/docs/zh/12-taos-sql/06-select.md +++ b/docs/zh/12-taos-sql/06-select.md @@ -12,7 +12,7 @@ SELECT {DATABASE() | CLIENT_VERSION() | SERVER_VERSION() | SERVER_STATUS() | NOW SELECT [DISTINCT] select_list from_clause [WHERE condition] - [PARTITION BY tag_list] + [partition_by_clause] [window_clause] [group_by_clause] [order_by_clasue] @@ -53,6 +53,9 @@ window_clause: { | STATE_WINDOW(col) | INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_val)] [WATERMARK(watermark_val)] [FILL(fill_mod_and_val)] +partition_by_clause: + PARTITION BY expr [, expr] ... + group_by_clause: GROUP BY expr [, expr] ... HAVING condition diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index c0203dadb8..ce9a9a7b50 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -374,8 +374,8 @@ static int32_t taosAddServerCfg(SConfig *pCfg) { tsNumOfVnodeStreamThreads = TMAX(tsNumOfVnodeStreamThreads, 4); if (cfgAddInt32(pCfg, "numOfVnodeStreamThreads", tsNumOfVnodeStreamThreads, 4, 1024, 0) != 0) return -1; - tsNumOfVnodeFetchThreads = 1; - if (cfgAddInt32(pCfg, "numOfVnodeFetchThreads", tsNumOfVnodeFetchThreads, 1, 1024, 0) != 0) return -1; +// tsNumOfVnodeFetchThreads = 1; +// if (cfgAddInt32(pCfg, "numOfVnodeFetchThreads", tsNumOfVnodeFetchThreads, 1, 1, 0) != 0) return -1; tsNumOfVnodeWriteThreads = tsNumOfCores; tsNumOfVnodeWriteThreads = TMAX(tsNumOfVnodeWriteThreads, 1); @@ -497,6 +497,7 @@ static int32_t taosUpdateServerCfg(SConfig *pCfg) { pItem->stype = stype; } +/* pItem = cfgGetItem(tsCfg, "numOfVnodeFetchThreads"); if (pItem != NULL && pItem->stype == CFG_STYPE_DEFAULT) { tsNumOfVnodeFetchThreads = numOfCores / 4; @@ -504,6 +505,7 @@ static int32_t taosUpdateServerCfg(SConfig *pCfg) { pItem->i32 = tsNumOfVnodeFetchThreads; pItem->stype = stype; } +*/ pItem = cfgGetItem(tsCfg, "numOfVnodeWriteThreads"); if (pItem != NULL && pItem->stype == CFG_STYPE_DEFAULT) { @@ -703,7 +705,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) { tsNumOfMnodeReadThreads = cfgGetItem(pCfg, "numOfMnodeReadThreads")->i32; tsNumOfVnodeQueryThreads = cfgGetItem(pCfg, "numOfVnodeQueryThreads")->i32; tsNumOfVnodeStreamThreads = cfgGetItem(pCfg, "numOfVnodeStreamThreads")->i32; - tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32; +// tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32; tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32; tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32; tsNumOfVnodeRsmaThreads = cfgGetItem(pCfg, "numOfVnodeRsmaThreads")->i32; @@ -953,8 +955,10 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) { tsNumOfMnodeReadThreads = cfgGetItem(pCfg, "numOfMnodeReadThreads")->i32; } else if (strcasecmp("numOfVnodeQueryThreads", name) == 0) { tsNumOfVnodeQueryThreads = cfgGetItem(pCfg, "numOfVnodeQueryThreads")->i32; +/* } else if (strcasecmp("numOfVnodeFetchThreads", name) == 0) { tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32; +*/ } else if (strcasecmp("numOfVnodeWriteThreads", name) == 0) { tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32; } else if (strcasecmp("numOfVnodeSyncThreads", name) == 0) {