diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index 5d1694ab90..b940caa53a 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -2880,8 +2880,12 @@ int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t byt char *data) { int32_t code = 0; if (data == NULL) { - for (int32_t i = 0; i < nRows; ++i) { - code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0); + if (pColData->cflag & COL_IS_KEY) { + code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL; + } else { + for (int32_t i = 0; i < nRows; ++i) { + code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0); + } } goto _exit; } @@ -2890,8 +2894,13 @@ int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t byt for (int32_t i = 0; i < nRows; ++i) { int32_t offset = *((int32_t *)lengthOrbitmap + i); if (offset == -1) { - code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0); - if (code) goto _exit; + if (pColData->cflag & COL_IS_KEY) { + code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL; + goto _exit; + } + if ((code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0))) { + goto _exit; + } } else { if (varDataTLen(data + offset) > bytes) { uError("var data length invalid, varDataTLen(data + offset):%d <= bytes:%d", (int)varDataTLen(data + offset), @@ -2913,6 +2922,10 @@ int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t byt allValue = false; } } + if ((pColData->cflag & COL_IS_KEY) && !allValue) { + code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL; + goto _exit; + } if (allValue) { // optimize (todo) @@ -2951,6 +2964,10 @@ int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32 if (IS_VAR_DATA_TYPE(pColData->type)) { // var-length data type for (int32_t i = 0; i < pBind->num; ++i) { if (pBind->is_null && pBind->is_null[i]) { + if (pColData->cflag & COL_IS_KEY) { + code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL; + goto _exit; + } code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0); if (code) goto _exit; } else if (pBind->length[i] > buffMaxLen) { @@ -2973,6 +2990,11 @@ int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32 allValue = true; } + if ((pColData->cflag & COL_IS_KEY) && !allValue) { + code = TSDB_CODE_PAR_PRIMARY_KEY_IS_NULL; + goto _exit; + } + if (allValue) { // optimize (todo) for (int32_t i = 0; i < pBind->num; ++i) { @@ -3002,91 +3024,6 @@ _exit: return code; } -#ifdef BUILD_NO_CALL -static int32_t tColDataSwapValue(SColData *pColData, int32_t i, int32_t j) { - int32_t code = 0; - - if (IS_VAR_DATA_TYPE(pColData->type)) { - int32_t nData1 = pColData->aOffset[i + 1] - pColData->aOffset[i]; - int32_t nData2 = (j < pColData->nVal - 1) ? pColData->aOffset[j + 1] - pColData->aOffset[j] - : pColData->nData - pColData->aOffset[j]; - uint8_t *pData = taosMemoryMalloc(TMAX(nData1, nData2)); - if (pData == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; - } - - if (nData1 > nData2) { - memcpy(pData, pColData->pData + pColData->aOffset[i], nData1); - memcpy(pColData->pData + pColData->aOffset[i], pColData->pData + pColData->aOffset[j], nData2); - // memmove(pColData->pData + pColData->aOffset[i] + nData2, pColData->pData + pColData->aOffset[i] + nData1, - // pColData->aOffset[j] - pColData->aOffset[i + 1]); - memmove(pColData->pData + pColData->aOffset[i] + nData2, pColData->pData + pColData->aOffset[i + 1], - pColData->aOffset[j] - pColData->aOffset[i + 1]); - memcpy(pColData->pData + pColData->aOffset[j] + nData2 - nData1, pData, nData1); - } else { - memcpy(pData, pColData->pData + pColData->aOffset[j], nData2); - memcpy(pColData->pData + pColData->aOffset[j] + nData2 - nData1, pColData->pData + pColData->aOffset[i], nData1); - // memmove(pColData->pData + pColData->aOffset[j] + nData2 - nData1, pColData->pData + pColData->aOffset[i] + - // nData1, - // pColData->aOffset[j] - pColData->aOffset[i + 1]); - memmove(pColData->pData + pColData->aOffset[i] + nData2, pColData->pData + pColData->aOffset[i + 1], - pColData->aOffset[j] - pColData->aOffset[i + 1]); - memcpy(pColData->pData + pColData->aOffset[i], pData, nData2); - } - for (int32_t k = i + 1; k <= j; ++k) { - pColData->aOffset[k] = pColData->aOffset[k] + nData2 - nData1; - } - - taosMemoryFree(pData); - } else { - uint64_t val; - memcpy(&val, &pColData->pData[TYPE_BYTES[pColData->type] * i], TYPE_BYTES[pColData->type]); - memcpy(&pColData->pData[TYPE_BYTES[pColData->type] * i], &pColData->pData[TYPE_BYTES[pColData->type] * j], - TYPE_BYTES[pColData->type]); - memcpy(&pColData->pData[TYPE_BYTES[pColData->type] * j], &val, TYPE_BYTES[pColData->type]); - } - -_exit: - return code; -} - -static void tColDataSwap(SColData *pColData, int32_t i, int32_t j) { - ASSERT(i < j); - ASSERT(j < pColData->nVal); - - switch (pColData->flag) { - case HAS_NONE: - case HAS_NULL: - break; - case (HAS_NULL | HAS_NONE): { - uint8_t bv = GET_BIT1(pColData->pBitMap, i); - SET_BIT1(pColData->pBitMap, i, GET_BIT1(pColData->pBitMap, j)); - SET_BIT1(pColData->pBitMap, j, bv); - } break; - case HAS_VALUE: { - tColDataSwapValue(pColData, i, j); - } break; - case (HAS_VALUE | HAS_NONE): - case (HAS_VALUE | HAS_NULL): { - uint8_t bv = GET_BIT1(pColData->pBitMap, i); - SET_BIT1(pColData->pBitMap, i, GET_BIT1(pColData->pBitMap, j)); - SET_BIT1(pColData->pBitMap, j, bv); - tColDataSwapValue(pColData, i, j); - } break; - case (HAS_VALUE | HAS_NULL | HAS_NONE): { - uint8_t bv = GET_BIT2(pColData->pBitMap, i); - SET_BIT2(pColData->pBitMap, i, GET_BIT2(pColData->pBitMap, j)); - SET_BIT2(pColData->pBitMap, j, bv); - tColDataSwapValue(pColData, i, j); - } break; - default: - ASSERT(0); - break; - } -} -#endif - static int32_t tColDataCopyRowCell(SColData *pFromColData, int32_t iFromRow, SColData *pToColData, int32_t iToRow) { int32_t code = TSDB_CODE_SUCCESS; diff --git a/source/libs/parser/src/parInsertSql.c b/source/libs/parser/src/parInsertSql.c index 71d832dc1f..bbcd27bd65 100644 --- a/source/libs/parser/src/parInsertSql.c +++ b/source/libs/parser/src/parInsertSql.c @@ -1392,7 +1392,7 @@ int32_t initTableColSubmitData(STableDataCxt* pTableCxt) { if (NULL == pCol) { return TSDB_CODE_OUT_OF_MEMORY; } - tColDataInit(pCol, pSchema->colId, pSchema->type, 0); + tColDataInit(pCol, pSchema->colId, pSchema->type, pSchema->flags); } return TSDB_CODE_SUCCESS;