[td-4038]<feature>: support column data batch bind.
This commit is contained in:
parent
29307ce31e
commit
8223aa416f
|
@ -154,13 +154,12 @@ typedef struct STagCond {
|
||||||
|
|
||||||
typedef struct SParamInfo {
|
typedef struct SParamInfo {
|
||||||
int32_t idx;
|
int32_t idx;
|
||||||
char type;
|
uint8_t type;
|
||||||
uint8_t timePrec;
|
uint8_t timePrec;
|
||||||
int16_t bytes;
|
int16_t bytes;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
} SParamInfo;
|
} SParamInfo;
|
||||||
|
|
||||||
|
|
||||||
typedef struct SBoundColumn {
|
typedef struct SBoundColumn {
|
||||||
bool hasVal; // denote if current column has bound or not
|
bool hasVal; // denote if current column has bound or not
|
||||||
int32_t offset; // all column offset value
|
int32_t offset; // all column offset value
|
||||||
|
|
|
@ -717,46 +717,15 @@ static int doBindParam(STableDataBlocks* pBlock, char* data, SParamInfo* param,
|
||||||
|
|
||||||
|
|
||||||
static int doBindBatchParam(STableDataBlocks* pBlock, SParamInfo* param, TAOS_MULTI_BIND* bind, int32_t rowNum) {
|
static int doBindBatchParam(STableDataBlocks* pBlock, SParamInfo* param, TAOS_MULTI_BIND* bind, int32_t rowNum) {
|
||||||
if (bind->buffer_type != param->type) {
|
if (bind->buffer_type != param->type || !isValidDataType(param->type)) {
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
short size = 0;
|
if (IS_VAR_DATA_TYPE(param->type) && bind->length == NULL) {
|
||||||
switch(param->type) {
|
tscError("BINARY/NCHAR no length");
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
size = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
size = 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
|
||||||
size = 4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
|
||||||
size = 8;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
|
||||||
if (bind->length == NULL) {
|
|
||||||
tscError("BINARY/NCHAR no length");
|
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
assert(false);
|
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < bind->num; ++i) {
|
for (int i = 0; i < bind->num; ++i) {
|
||||||
char* data = pBlock->pData + sizeof(SSubmitBlk) + pBlock->rowSize * (rowNum + i);
|
char* data = pBlock->pData + sizeof(SSubmitBlk) + pBlock->rowSize * (rowNum + i);
|
||||||
|
|
||||||
|
@ -765,8 +734,8 @@ static int doBindBatchParam(STableDataBlocks* pBlock, SParamInfo* param, TAOS_MU
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size > 0) {
|
if (!IS_VAR_DATA_TYPE(param->type)) {
|
||||||
memcpy(data + param->offset, bind->buffer + bind->buffer_length * i, size);
|
memcpy(data + param->offset, bind->buffer + bind->buffer_length * i, tDataTypes[param->type].bytes);
|
||||||
|
|
||||||
if (param->offset == 0) {
|
if (param->offset == 0) {
|
||||||
if (tsCheckTimestamp(pBlock, data + param->offset) != TSDB_CODE_SUCCESS) {
|
if (tsCheckTimestamp(pBlock, data + param->offset) != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -776,12 +745,17 @@ static int doBindBatchParam(STableDataBlocks* pBlock, SParamInfo* param, TAOS_MU
|
||||||
}
|
}
|
||||||
} else if (param->type == TSDB_DATA_TYPE_BINARY) {
|
} else if (param->type == TSDB_DATA_TYPE_BINARY) {
|
||||||
if (bind->length[i] > (uintptr_t)param->bytes) {
|
if (bind->length[i] > (uintptr_t)param->bytes) {
|
||||||
tscError("binary length too long, ignore it, expect:%d, actual:%d", param->bytes, (int32_t)bind->length[i]);
|
tscError("binary length too long, ignore it, max:%d, actual:%d", param->bytes, (int32_t)bind->length[i]);
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
}
|
}
|
||||||
int16_t bsize = (short)bind->length[i];
|
int16_t bsize = (short)bind->length[i];
|
||||||
STR_WITH_SIZE_TO_VARSTR(data + param->offset, bind->buffer + bind->buffer_length * i, bsize);
|
STR_WITH_SIZE_TO_VARSTR(data + param->offset, bind->buffer + bind->buffer_length * i, bsize);
|
||||||
} else if (param->type == TSDB_DATA_TYPE_NCHAR) {
|
} else if (param->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
if (bind->length[i] > (uintptr_t)param->bytes) {
|
||||||
|
tscError("nchar string length too long, ignore it, max:%d, actual:%d", param->bytes, (int32_t)bind->length[i]);
|
||||||
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t output = 0;
|
int32_t output = 0;
|
||||||
if (!taosMbsToUcs4(bind->buffer + bind->buffer_length * i, bind->length[i], varDataVal(data + param->offset), param->bytes - VARSTR_HEADER_SIZE, &output)) {
|
if (!taosMbsToUcs4(bind->buffer + bind->buffer_length * i, bind->length[i], varDataVal(data + param->offset), param->bytes - VARSTR_HEADER_SIZE, &output)) {
|
||||||
tscError("convert nchar string to UCS4_LE failed:%s", (char*)(bind->buffer + bind->buffer_length * i));
|
tscError("convert nchar string to UCS4_LE failed:%s", (char*)(bind->buffer + bind->buffer_length * i));
|
||||||
|
@ -795,8 +769,6 @@ static int doBindBatchParam(STableDataBlocks* pBlock, SParamInfo* param, TAOS_MU
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int insertStmtBindParam(STscStmt* stmt, TAOS_BIND* bind) {
|
static int insertStmtBindParam(STscStmt* stmt, TAOS_BIND* bind) {
|
||||||
SSqlCmd* pCmd = &stmt->pSql->cmd;
|
SSqlCmd* pCmd = &stmt->pSql->cmd;
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
Loading…
Reference in New Issue