Merge from master into develop
This commit is contained in:
commit
644f41a0bb
|
@ -21,8 +21,8 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#include "taosmsg.h"
|
||||
#include "tstoken.h"
|
||||
#include "tsclient.h"
|
||||
#include "ttoken.h"
|
||||
|
||||
/**
|
||||
* get the number of tags of this table
|
||||
|
|
|
@ -29,8 +29,7 @@
|
|||
#include "taosdef.h"
|
||||
|
||||
#include "tscLog.h"
|
||||
#include "tscSubquery.h"
|
||||
#include "tstoken.h"
|
||||
#include "ttoken.h"
|
||||
|
||||
#include "tdataformat.h"
|
||||
|
||||
|
@ -464,22 +463,23 @@ int tsParseOneRow(char **str, STableDataBlocks *pDataBlocks, SSqlCmd *pCmd, int1
|
|||
if (TK_STRING == sToken.type) {
|
||||
// delete escape character: \\, \', \"
|
||||
char delim = sToken.z[0];
|
||||
|
||||
int32_t cnt = 0;
|
||||
int32_t j = 0;
|
||||
for (uint32_t k = 1; k < sToken.n - 1; ++k) {
|
||||
if (sToken.z[k] == delim || sToken.z[k] == '\\') {
|
||||
if (sToken.z[k + 1] == delim) {
|
||||
cnt++;
|
||||
if (sToken.z[k] == '\\' || (sToken.z[k] == delim && sToken.z[k + 1] == delim)) {
|
||||
tmpTokenBuf[j] = sToken.z[k + 1];
|
||||
|
||||
cnt++;
|
||||
j++;
|
||||
k++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
tmpTokenBuf[j] = sToken.z[k];
|
||||
j++;
|
||||
}
|
||||
|
||||
tmpTokenBuf[j] = 0;
|
||||
sToken.z = tmpTokenBuf;
|
||||
sToken.n -= 2 + cnt;
|
||||
|
@ -1003,7 +1003,7 @@ int validateTableName(char *tblName, int len, SStrToken* psTblToken) {
|
|||
|
||||
psTblToken->n = len;
|
||||
psTblToken->type = TK_ID;
|
||||
tSQLGetToken(psTblToken->z, &psTblToken->type);
|
||||
tGetToken(psTblToken->z, &psTblToken->type);
|
||||
|
||||
return tscValidateName(psTblToken);
|
||||
}
|
||||
|
|
|
@ -151,7 +151,7 @@ static int normalStmtPrepare(STscStmt* stmt) {
|
|||
|
||||
while (sql[i] != 0) {
|
||||
SStrToken token = {0};
|
||||
token.n = tSQLGetToken(sql + i, &token.type);
|
||||
token.n = tGetToken(sql + i, &token.type);
|
||||
|
||||
if (token.type == TK_QUESTION) {
|
||||
sql[i] = 0;
|
||||
|
|
|
@ -21,19 +21,19 @@
|
|||
#endif // __APPLE__
|
||||
|
||||
#include "os.h"
|
||||
#include "ttype.h"
|
||||
#include "texpr.h"
|
||||
#include "taos.h"
|
||||
#include "taosmsg.h"
|
||||
#include "tcompare.h"
|
||||
#include "texpr.h"
|
||||
#include "tname.h"
|
||||
#include "tscLog.h"
|
||||
#include "tscUtil.h"
|
||||
#include "tschemautil.h"
|
||||
#include "tsclient.h"
|
||||
#include "tstoken.h"
|
||||
#include "tstrbuild.h"
|
||||
#include "ttoken.h"
|
||||
#include "ttokendef.h"
|
||||
#include "ttype.h"
|
||||
#include "qUtil.h"
|
||||
|
||||
#define DEFAULT_PRIMARY_TIMESTAMP_COL_NAME "_c0"
|
||||
|
@ -432,7 +432,6 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
|
|||
if (tscValidateName(pToken) != TSDB_CODE_SUCCESS) {
|
||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
||||
// additional msg has been attached already
|
||||
code = tscSetTableFullName(pTableMetaInfo, pToken, pSql);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
|
@ -984,7 +983,6 @@ int32_t tscSetTableFullName(STableMetaInfo* pTableMetaInfo, SStrToken* pTableNam
|
|||
const char* msg4 = "db name too long";
|
||||
const char* msg5 = "table name too long";
|
||||
|
||||
|
||||
SSqlCmd* pCmd = &pSql->cmd;
|
||||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
int32_t idx = getDelimiterIndex(pTableName);
|
||||
|
@ -4645,7 +4643,7 @@ int32_t getTimeRange(STimeWindow* win, tSqlExpr* pRight, int32_t optr, int16_t t
|
|||
}
|
||||
} else {
|
||||
SStrToken token = {.z = pRight->value.pz, .n = pRight->value.nLen, .type = TK_ID};
|
||||
int32_t len = tSQLGetToken(pRight->value.pz, &token.type);
|
||||
int32_t len = tGetToken(pRight->value.pz, &token.type);
|
||||
|
||||
if ((token.type != TK_INTEGER && token.type != TK_FLOAT) || len != pRight->value.nLen) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
|
@ -5532,13 +5530,13 @@ int32_t validateLocalConfig(SMiscInfo* pOptions) {
|
|||
}
|
||||
|
||||
int32_t validateColumnName(char* name) {
|
||||
bool ret = isKeyWord(name, (int32_t)strlen(name));
|
||||
bool ret = taosIsKeyWordToken(name, (int32_t)strlen(name));
|
||||
if (ret) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
||||
SStrToken token = {.z = name};
|
||||
token.n = tSQLGetToken(name, &token.type);
|
||||
token.n = tGetToken(name, &token.type);
|
||||
|
||||
if (token.type != TK_STRING && token.type != TK_ID) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
|
@ -5549,7 +5547,7 @@ int32_t validateColumnName(char* name) {
|
|||
strntolower(token.z, token.z, token.n);
|
||||
token.n = (uint32_t)strtrim(token.z);
|
||||
|
||||
int32_t k = tSQLGetToken(token.z, &token.type);
|
||||
int32_t k = tGetToken(token.z, &token.type);
|
||||
if (k != token.n) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
@ -7526,4 +7524,3 @@ bool hasNormalColumnFilter(SQueryInfo* pQueryInfo) {
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -1881,6 +1881,8 @@ int tscProcessTableMetaRsp(SSqlObj *pSql) {
|
|||
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||
}
|
||||
|
||||
assert(pTableMeta->tableType == TSDB_SUPER_TABLE || pTableMeta->tableType == TSDB_CHILD_TABLE || pTableMeta->tableType == TSDB_NORMAL_TABLE || pTableMeta->tableType == TSDB_STREAM_TABLE);
|
||||
|
||||
if (pTableMeta->tableType == TSDB_CHILD_TABLE) {
|
||||
// check if super table hashmap or not
|
||||
int32_t len = (int32_t) strnlen(pTableMeta->sTableName, TSDB_TABLE_FNAME_LEN);
|
||||
|
@ -2451,6 +2453,7 @@ int32_t tscGetTableMeta(SSqlObj *pSql, STableMetaInfo *pTableMetaInfo) {
|
|||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||
}
|
||||
pTableMetaInfo->pTableMeta = (STableMeta *)tmp;
|
||||
memset(pTableMetaInfo->pTableMeta, 0, size);
|
||||
pTableMetaInfo->tableMetaSize = size;
|
||||
} else {
|
||||
//uint32_t s = tscGetTableMetaSize(pTableMetaInfo->pTableMeta);
|
||||
|
|
|
@ -962,7 +962,7 @@ static int tscParseTblNameList(SSqlObj *pSql, const char *tblNameList, int32_t t
|
|||
len = (int32_t)strtrim(tblName);
|
||||
|
||||
SStrToken sToken = {.n = len, .type = TK_ID, .z = tblName};
|
||||
tSQLGetToken(tblName, &sToken.type);
|
||||
tGetToken(tblName, &sToken.type);
|
||||
|
||||
// Check if the table name available or not
|
||||
if (tscValidateName(&sToken) != TSDB_CODE_SUCCESS) {
|
||||
|
|
|
@ -1889,7 +1889,7 @@ void tscColumnListDestroy(SArray* pColumnList) {
|
|||
static int32_t validateQuoteToken(SStrToken* pToken) {
|
||||
tscDequoteAndTrimToken(pToken);
|
||||
|
||||
int32_t k = tSQLGetToken(pToken->z, &pToken->type);
|
||||
int32_t k = tGetToken(pToken->z, &pToken->type);
|
||||
|
||||
if (pToken->type == TK_STRING) {
|
||||
return tscValidateName(pToken);
|
||||
|
@ -1957,7 +1957,7 @@ int32_t tscValidateName(SStrToken* pToken) {
|
|||
tscStrToLower(pToken->z, pToken->n);
|
||||
//pToken->n = (uint32_t)strtrim(pToken->z);
|
||||
|
||||
int len = tSQLGetToken(pToken->z, &pToken->type);
|
||||
int len = tGetToken(pToken->z, &pToken->type);
|
||||
|
||||
// single token, validate it
|
||||
if (len == pToken->n) {
|
||||
|
@ -1983,7 +1983,7 @@ int32_t tscValidateName(SStrToken* pToken) {
|
|||
pToken->n = (uint32_t)strtrim(pToken->z);
|
||||
}
|
||||
|
||||
pToken->n = tSQLGetToken(pToken->z, &pToken->type);
|
||||
pToken->n = tGetToken(pToken->z, &pToken->type);
|
||||
if (pToken->z[pToken->n] != TS_PATH_DELIMITER[0]) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
@ -2000,7 +2000,7 @@ int32_t tscValidateName(SStrToken* pToken) {
|
|||
|
||||
pToken->z = sep + 1;
|
||||
pToken->n = (uint32_t)(oldLen - (sep - pStr) - 1);
|
||||
int32_t len = tSQLGetToken(pToken->z, &pToken->type);
|
||||
int32_t len = tGetToken(pToken->z, &pToken->type);
|
||||
if (len != pToken->n || (pToken->type != TK_STRING && pToken->type != TK_ID)) {
|
||||
return TSDB_CODE_TSC_INVALID_SQL;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include <iostream>
|
||||
|
||||
#include "taos.h"
|
||||
#include "tstoken.h"
|
||||
#include "ttoken.h"
|
||||
#include "tutil.h"
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include "os.h"
|
||||
#include "taosmsg.h"
|
||||
#include "tstoken.h"
|
||||
#include "ttoken.h"
|
||||
#include "tvariant.h"
|
||||
|
||||
typedef struct SDataStatis {
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
#ifndef TDENGINE_TVARIANT_H
|
||||
#define TDENGINE_TVARIANT_H
|
||||
|
||||
#include "tstoken.h"
|
||||
#include "tarray.h"
|
||||
#include "ttoken.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#include "tutil.h"
|
||||
|
||||
#include "tname.h"
|
||||
#include "tstoken.h"
|
||||
#include "ttoken.h"
|
||||
#include "tvariant.h"
|
||||
|
||||
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
|
||||
|
|
|
@ -14,14 +14,14 @@
|
|||
*/
|
||||
#include "os.h"
|
||||
|
||||
#include "tvariant.h"
|
||||
#include "hash.h"
|
||||
#include "taos.h"
|
||||
#include "taosdef.h"
|
||||
#include "tstoken.h"
|
||||
#include "ttoken.h"
|
||||
#include "ttokendef.h"
|
||||
#include "tutil.h"
|
||||
#include "ttype.h"
|
||||
#include "tutil.h"
|
||||
#include "tvariant.h"
|
||||
|
||||
void tVariantCreate(tVariant *pVar, SStrToken *token) {
|
||||
int32_t ret = 0;
|
||||
|
@ -49,7 +49,7 @@ void tVariantCreate(tVariant *pVar, SStrToken *token) {
|
|||
ret = tStrToInteger(token->z, token->type, token->n, &pVar->i64, true);
|
||||
if (ret != 0) {
|
||||
SStrToken t = {0};
|
||||
tSQLGetToken(token->z, &t.type);
|
||||
tGetToken(token->z, &t.type);
|
||||
if (t.type == TK_MINUS) { // it is a signed number which is greater than INT64_MAX or less than INT64_MIN
|
||||
pVar->nType = -1; // -1 means error type
|
||||
return;
|
||||
|
@ -460,7 +460,7 @@ static FORCE_INLINE int32_t convertToInteger(tVariant *pVariant, int64_t *result
|
|||
*result = (int64_t) pVariant->dKey;
|
||||
} else if (pVariant->nType == TSDB_DATA_TYPE_BINARY) {
|
||||
SStrToken token = {.z = pVariant->pz, .n = pVariant->nLen};
|
||||
/*int32_t n = */tSQLGetToken(pVariant->pz, &token.type);
|
||||
/*int32_t n = */tGetToken(pVariant->pz, &token.type);
|
||||
|
||||
if (token.type == TK_NULL) {
|
||||
if (releaseVariantPtr) {
|
||||
|
@ -495,10 +495,10 @@ static FORCE_INLINE int32_t convertToInteger(tVariant *pVariant, int64_t *result
|
|||
wchar_t *endPtr = NULL;
|
||||
|
||||
SStrToken token = {0};
|
||||
token.n = tSQLGetToken(pVariant->pz, &token.type);
|
||||
token.n = tGetToken(pVariant->pz, &token.type);
|
||||
|
||||
if (token.type == TK_MINUS || token.type == TK_PLUS) {
|
||||
token.n = tSQLGetToken(pVariant->pz + token.n, &token.type);
|
||||
token.n = tGetToken(pVariant->pz + token.n, &token.type);
|
||||
}
|
||||
|
||||
if (token.type == TK_FLOAT) {
|
||||
|
|
|
@ -12,7 +12,7 @@ public class InsertSpecialCharacterJniTest {
|
|||
private static String tbname1 = "test";
|
||||
private static String tbname2 = "weather";
|
||||
private static String special_character_str_1 = "$asd$$fsfsf$";
|
||||
private static String special_character_str_2 = "\\asdfsfsf\\\\";
|
||||
private static String special_character_str_2 = "\\\\asdfsfsf\\\\";
|
||||
private static String special_character_str_3 = "\\\\asdfsfsf\\";
|
||||
private static String special_character_str_4 = "?asd??fsf?sf?";
|
||||
private static String special_character_str_5 = "?#sd@$f(('<(s[P)>\"){]}f?s[]{}%vaew|\"fsfs^a&d*jhg)(j))(f@~!?$";
|
||||
|
@ -70,7 +70,7 @@ public class InsertSpecialCharacterJniTest {
|
|||
String f1 = new String(rs.getBytes(2));
|
||||
//TODO: bug to be fixed
|
||||
// Assert.assertEquals(special_character_str_2, f1);
|
||||
Assert.assertEquals(special_character_str_2.substring(0, special_character_str_1.length() - 2), f1);
|
||||
Assert.assertEquals(special_character_str_2.substring(1, special_character_str_1.length() - 1), f1);
|
||||
String f2 = rs.getString(3);
|
||||
Assert.assertNull(f2);
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ public class InsertSpecialCharacterRestfulTest {
|
|||
private static String tbname1 = "test";
|
||||
private static String tbname2 = "weather";
|
||||
private static String special_character_str_1 = "$asd$$fsfsf$";
|
||||
private static String special_character_str_2 = "\\asdfsfsf\\\\";
|
||||
private static String special_character_str_2 = "\\\\asdfsfsf\\\\";
|
||||
private static String special_character_str_3 = "\\\\asdfsfsf\\";
|
||||
private static String special_character_str_4 = "?asd??fsf?sf?";
|
||||
private static String special_character_str_5 = "?#sd@$f(('<(s[P)>\"){]}f?s[]{}%vaew|\"fsfs^a&d*jhg)(j))(f@~!?$";
|
||||
|
@ -49,7 +49,7 @@ public class InsertSpecialCharacterRestfulTest {
|
|||
@Test
|
||||
public void testCase02() throws SQLException {
|
||||
//TODO:
|
||||
// Expected :\asdfsfsf\\
|
||||
// Expected :\asdfsfsf\
|
||||
// Actual :\asdfsfsf\
|
||||
|
||||
final long now = System.currentTimeMillis();
|
||||
|
@ -71,7 +71,7 @@ public class InsertSpecialCharacterRestfulTest {
|
|||
String f1 = new String(rs.getBytes(2));
|
||||
//TODO: bug to be fixed
|
||||
// Assert.assertEquals(special_character_str_2, f1);
|
||||
Assert.assertEquals(special_character_str_2.substring(0, special_character_str_1.length() - 2), f1);
|
||||
Assert.assertEquals(special_character_str_2.substring(1, special_character_str_1.length() - 1), f1);
|
||||
String f2 = rs.getString(3);
|
||||
Assert.assertNull(f2);
|
||||
}
|
||||
|
|
|
@ -68,8 +68,17 @@ enum TEST_MODE {
|
|||
INVAID_TEST
|
||||
};
|
||||
|
||||
enum QUERY_MODE {
|
||||
SYNC_QUERY_MODE, // 0
|
||||
ASYNC_QUERY_MODE, // 1
|
||||
INVALID_MODE
|
||||
};
|
||||
|
||||
#define MAX_RECORDS_PER_REQ 32766
|
||||
|
||||
#define MAX_SQL_SIZE 65536
|
||||
#define BUFFER_SIZE (65536*2)
|
||||
#define COND_BUF_LEN BUFFER_SIZE - 30
|
||||
#define MAX_USERNAME_SIZE 64
|
||||
#define MAX_PASSWORD_SIZE 64
|
||||
#define MAX_DB_NAME_SIZE 64
|
||||
|
@ -516,6 +525,8 @@ static int taosRandom()
|
|||
static int createDatabasesAndStables();
|
||||
static void createChildTables();
|
||||
static int queryDbExec(TAOS *taos, char *command, QUERY_TYPE type, bool quiet);
|
||||
static int postProceSql(char *host, struct sockaddr_in *pServAddr, uint16_t port,
|
||||
char* sqlstr, char *resultFile);
|
||||
|
||||
/* ************ Global variables ************ */
|
||||
|
||||
|
@ -765,49 +776,48 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
|||
}
|
||||
arguments->sqlFile = argv[++i];
|
||||
} else if (strcmp(argv[i], "-q") == 0) {
|
||||
if ((argc == i+1)
|
||||
|| (!isStringNumber(argv[i+1]))) {
|
||||
if ((argc == i+1) ||
|
||||
(!isStringNumber(argv[i+1]))) {
|
||||
printHelp();
|
||||
errorPrint("%s", "\n\t-q need a number following!\nQuery mode -- 0: SYNC, 1: ASYNC. Default is SYNC.\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
arguments->async_mode = atoi(argv[++i]);
|
||||
} else if (strcmp(argv[i], "-T") == 0) {
|
||||
if ((argc == i+1)
|
||||
|| (!isStringNumber(argv[i+1]))) {
|
||||
if ((argc == i+1) ||
|
||||
(!isStringNumber(argv[i+1]))) {
|
||||
printHelp();
|
||||
errorPrint("%s", "\n\t-T need a number following!\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
arguments->num_of_threads = atoi(argv[++i]);
|
||||
} else if (strcmp(argv[i], "-i") == 0) {
|
||||
if ((argc == i+1)
|
||||
|| (!isStringNumber(argv[i+1]))) {
|
||||
if ((argc == i+1) ||
|
||||
(!isStringNumber(argv[i+1]))) {
|
||||
printHelp();
|
||||
errorPrint("%s", "\n\t-i need a number following!\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
arguments->insert_interval = atoi(argv[++i]);
|
||||
} else if (strcmp(argv[i], "-qt") == 0) {
|
||||
if ((argc == i+1)
|
||||
|| (!isStringNumber(argv[i+1]))
|
||||
|| (atoi(argv[i+1]) <= 0)) {
|
||||
if ((argc == i+1) ||
|
||||
(!isStringNumber(argv[i+1]))) {
|
||||
printHelp();
|
||||
errorPrint("%s", "\n\t-qt need a valid (>0) number following!\n");
|
||||
errorPrint("%s", "\n\t-qt need a number following!\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
arguments->query_times = atoi(argv[++i]);
|
||||
} else if (strcmp(argv[i], "-B") == 0) {
|
||||
if ((argc == i+1)
|
||||
|| (!isStringNumber(argv[i+1]))) {
|
||||
if ((argc == i+1) ||
|
||||
(!isStringNumber(argv[i+1]))) {
|
||||
printHelp();
|
||||
errorPrint("%s", "\n\t-B need a number following!\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
arguments->interlace_rows = atoi(argv[++i]);
|
||||
} else if (strcmp(argv[i], "-r") == 0) {
|
||||
if ((argc == i+1)
|
||||
|| (!isStringNumber(argv[i+1]))) {
|
||||
if ((argc == i+1) ||
|
||||
(!isStringNumber(argv[i+1]))) {
|
||||
printHelp();
|
||||
errorPrint("%s", "\n\t-r need a number following!\n");
|
||||
exit(EXIT_FAILURE);
|
||||
|
@ -1067,7 +1077,7 @@ static int queryDbExec(TAOS *taos, char *command, QUERY_TYPE type, bool quiet) {
|
|||
if (code != 0) {
|
||||
if (!quiet) {
|
||||
debugPrint("%s() LN%d - command: %s\n", __func__, __LINE__, command);
|
||||
errorPrint("Failed to execute %s, reason: %s\n", command, taos_errstr(res));
|
||||
errorPrint("Failed to run %s, reason: %s\n", command, taos_errstr(res));
|
||||
}
|
||||
taos_free_result(res);
|
||||
//taos_close(taos);
|
||||
|
@ -1084,27 +1094,33 @@ static int queryDbExec(TAOS *taos, char *command, QUERY_TYPE type, bool quiet) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void getResult(TAOS_RES *res, char* resultFileName) {
|
||||
static void appendResultBufToFile(char *resultBuf, char *resultFile)
|
||||
{
|
||||
FILE *fp = NULL;
|
||||
if (resultFile[0] != 0) {
|
||||
fp = fopen(resultFile, "at");
|
||||
if (fp == NULL) {
|
||||
errorPrint(
|
||||
"%s() LN%d, failed to open result file: %s, result will not save to file\n",
|
||||
__func__, __LINE__, resultFile);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(fp, "%s", resultBuf);
|
||||
tmfclose(fp);
|
||||
}
|
||||
|
||||
static void appendResultToFile(TAOS_RES *res, char* resultFile) {
|
||||
TAOS_ROW row = NULL;
|
||||
int num_rows = 0;
|
||||
int num_fields = taos_field_count(res);
|
||||
TAOS_FIELD *fields = taos_fetch_fields(res);
|
||||
|
||||
FILE *fp = NULL;
|
||||
if (resultFileName[0] != 0) {
|
||||
fp = fopen(resultFileName, "at");
|
||||
if (fp == NULL) {
|
||||
errorPrint("%s() LN%d, failed to open result file: %s, result will not save to file\n",
|
||||
__func__, __LINE__, resultFileName);
|
||||
}
|
||||
}
|
||||
|
||||
char* databuf = (char*) calloc(1, 100*1024*1024);
|
||||
if (databuf == NULL) {
|
||||
errorPrint("%s() LN%d, failed to malloc, warning: save result to file slowly!\n",
|
||||
__func__, __LINE__);
|
||||
if (fp)
|
||||
fclose(fp);
|
||||
return ;
|
||||
}
|
||||
|
||||
|
@ -1114,7 +1130,7 @@ static void getResult(TAOS_RES *res, char* resultFileName) {
|
|||
// fetch the records row by row
|
||||
while((row = taos_fetch_row(res))) {
|
||||
if (totalLen >= 100*1024*1024 - 32000) {
|
||||
if (fp) fprintf(fp, "%s", databuf);
|
||||
appendResultBufToFile(databuf, resultFile);
|
||||
totalLen = 0;
|
||||
memset(databuf, 0, 100*1024*1024);
|
||||
}
|
||||
|
@ -1126,13 +1142,14 @@ static void getResult(TAOS_RES *res, char* resultFileName) {
|
|||
totalLen += len;
|
||||
}
|
||||
|
||||
if (fp) fprintf(fp, "%s", databuf);
|
||||
tmfclose(fp);
|
||||
appendResultBufToFile(databuf, resultFile);
|
||||
free(databuf);
|
||||
}
|
||||
|
||||
static void selectAndGetResult(TAOS *taos, char *command, char* resultFileName) {
|
||||
TAOS_RES *res = taos_query(taos, command);
|
||||
static void selectAndGetResult(threadInfo *pThreadInfo, char *command, char* resultFile)
|
||||
{
|
||||
if (0 == strncasecmp(g_queryInfo.queryMode, "taosc", strlen("taosc"))) {
|
||||
TAOS_RES *res = taos_query(pThreadInfo->taos, command);
|
||||
if (res == NULL || taos_errno(res) != 0) {
|
||||
errorPrint("%s() LN%d, failed to execute sql:%s, reason:%s\n",
|
||||
__func__, __LINE__, command, taos_errstr(res));
|
||||
|
@ -1140,8 +1157,24 @@ static void selectAndGetResult(TAOS *taos, char *command, char* resultFileName)
|
|||
return;
|
||||
}
|
||||
|
||||
getResult(res, resultFileName);
|
||||
if ((resultFile) && (strlen(resultFile))) {
|
||||
appendResultToFile(res, resultFile);
|
||||
}
|
||||
taos_free_result(res);
|
||||
|
||||
} else if (0 == strncasecmp(g_queryInfo.queryMode, "rest", strlen("rest"))) {
|
||||
int retCode = postProceSql(
|
||||
g_queryInfo.host, &(g_queryInfo.serv_addr), g_queryInfo.port,
|
||||
command,
|
||||
resultFile);
|
||||
if (0 != retCode) {
|
||||
printf("====restful return fail, threadID[%d]\n", pThreadInfo->threadID);
|
||||
}
|
||||
|
||||
} else {
|
||||
errorPrint("%s() LN%d, unknown query mode: %s\n",
|
||||
__func__, __LINE__, g_queryInfo.queryMode);
|
||||
}
|
||||
}
|
||||
|
||||
static int32_t rand_bool(){
|
||||
|
@ -1934,13 +1967,13 @@ static void printfQuerySystemInfo(TAOS * taos) {
|
|||
|
||||
// show variables
|
||||
res = taos_query(taos, "show variables;");
|
||||
//getResult(res, filename);
|
||||
//appendResultToFile(res, filename);
|
||||
xDumpResultToFile(filename, res);
|
||||
|
||||
// show dnodes
|
||||
res = taos_query(taos, "show dnodes;");
|
||||
xDumpResultToFile(filename, res);
|
||||
//getResult(res, filename);
|
||||
//appendResultToFile(res, filename);
|
||||
|
||||
// show databases
|
||||
res = taos_query(taos, "show databases;");
|
||||
|
@ -1975,7 +2008,8 @@ static void printfQuerySystemInfo(TAOS * taos) {
|
|||
free(dbInfos);
|
||||
}
|
||||
|
||||
static int postProceSql(char *host, struct sockaddr_in *pServAddr, uint16_t port, char* sqlstr)
|
||||
static int postProceSql(char *host, struct sockaddr_in *pServAddr, uint16_t port,
|
||||
char* sqlstr, char *resultFile)
|
||||
{
|
||||
char *req_fmt = "POST %s HTTP/1.1\r\nHost: %s:%d\r\nAccept: */*\r\nAuthorization: Basic %s\r\nContent-Length: %d\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n%s";
|
||||
|
||||
|
@ -2111,6 +2145,10 @@ static int postProceSql(char *host, struct sockaddr_in *pServAddr, uint16_t port
|
|||
response_buf[RESP_BUF_LEN - 1] = '\0';
|
||||
printf("Response:\n%s\n", response_buf);
|
||||
|
||||
if (resultFile) {
|
||||
appendResultBufToFile(response_buf, resultFile);
|
||||
}
|
||||
|
||||
free(request_buf);
|
||||
#ifdef WINDOWS
|
||||
closesocket(sockfd);
|
||||
|
@ -3406,10 +3444,12 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
|||
errorPrint("%s() LN%d, failed to read json, num_of_records_per_req input mistake\n",
|
||||
__func__, __LINE__);
|
||||
goto PARSE_OVER;
|
||||
} else if (numRecPerReq->valueint > MAX_RECORDS_PER_REQ) {
|
||||
numRecPerReq->valueint = MAX_RECORDS_PER_REQ;
|
||||
}
|
||||
g_args.num_of_RPR = numRecPerReq->valueint;
|
||||
} else if (!numRecPerReq) {
|
||||
g_args.num_of_RPR = UINT64_MAX;
|
||||
g_args.num_of_RPR = MAX_RECORDS_PER_REQ;
|
||||
} else {
|
||||
errorPrint("%s() LN%d, failed to read json, num_of_records_per_req not found\n",
|
||||
__func__, __LINE__);
|
||||
|
@ -4035,9 +4075,9 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
|||
|
||||
cJSON* gQueryTimes = cJSON_GetObjectItem(root, "query_times");
|
||||
if (gQueryTimes && gQueryTimes->type == cJSON_Number) {
|
||||
if (gQueryTimes->valueint <= 0) {
|
||||
errorPrint("%s() LN%d, failed to read json, query_times: %"PRId64", need be a valid (>0) number\n",
|
||||
__func__, __LINE__, gQueryTimes->valueint);
|
||||
if (gQueryTimes->valueint < 0) {
|
||||
errorPrint("%s() LN%d, failed to read json, query_times input mistake\n",
|
||||
__func__, __LINE__);
|
||||
goto PARSE_OVER;
|
||||
}
|
||||
g_args.query_times = gQueryTimes->valueint;
|
||||
|
@ -4086,9 +4126,9 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
|||
cJSON* specifiedQueryTimes = cJSON_GetObjectItem(specifiedQuery,
|
||||
"query_times");
|
||||
if (specifiedQueryTimes && specifiedQueryTimes->type == cJSON_Number) {
|
||||
if (specifiedQueryTimes->valueint <= 0) {
|
||||
errorPrint("%s() LN%d, failed to read json, query_times: %"PRId64", need be a valid (>0) number\n",
|
||||
__func__, __LINE__, specifiedQueryTimes->valueint);
|
||||
if (specifiedQueryTimes->valueint < 0) {
|
||||
errorPrint("%s() LN%d, failed to read json, query_times input mistake\n",
|
||||
__func__, __LINE__);
|
||||
goto PARSE_OVER;
|
||||
|
||||
}
|
||||
|
@ -4230,9 +4270,9 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
|||
|
||||
cJSON* superQueryTimes = cJSON_GetObjectItem(superQuery, "query_times");
|
||||
if (superQueryTimes && superQueryTimes->type == cJSON_Number) {
|
||||
if (superQueryTimes->valueint <= 0) {
|
||||
errorPrint("%s() LN%d, failed to read json, query_times: %"PRId64", need be a valid (>0) number\n",
|
||||
__func__, __LINE__, superQueryTimes->valueint);
|
||||
if (superQueryTimes->valueint < 0) {
|
||||
errorPrint("%s() LN%d, failed to read json, query_times input mistake\n",
|
||||
__func__, __LINE__);
|
||||
goto PARSE_OVER;
|
||||
}
|
||||
g_queryInfo.superQueryInfo.queryTimes = superQueryTimes->valueint;
|
||||
|
@ -4682,7 +4722,8 @@ static int64_t execInsert(threadInfo *pThreadInfo, char *buffer, uint64_t k)
|
|||
if (0 == strncasecmp(superTblInfo->insertMode, "taosc", strlen("taosc"))) {
|
||||
affectedRows = queryDbExec(pThreadInfo->taos, buffer, INSERT_TYPE, false);
|
||||
} else if (0 == strncasecmp(superTblInfo->insertMode, "rest", strlen("rest"))) {
|
||||
if (0 != postProceSql(g_Dbs.host, &g_Dbs.serv_addr, g_Dbs.port, buffer)) {
|
||||
if (0 != postProceSql(g_Dbs.host, &g_Dbs.serv_addr, g_Dbs.port,
|
||||
buffer, NULL /* not set result file */)) {
|
||||
affectedRows = -1;
|
||||
printf("========restful return fail, threadID[%d]\n",
|
||||
pThreadInfo->threadID);
|
||||
|
@ -5195,13 +5236,6 @@ static void* syncWriteInterlace(threadInfo *pThreadInfo) {
|
|||
|
||||
startTs = taosGetTimestampMs();
|
||||
|
||||
if (recOfBatch == 0) {
|
||||
errorPrint("[%d] %s() LN%d try inserting records of batch is %"PRIu64"\n",
|
||||
pThreadInfo->threadID, __func__, __LINE__,
|
||||
recOfBatch);
|
||||
errorPrint("%s\n", "\tPlease check if the batch or the buffer length is proper value!\n");
|
||||
goto free_of_interlace;
|
||||
}
|
||||
int64_t affectedRows = execInsert(pThreadInfo, buffer, recOfBatch);
|
||||
|
||||
endTs = taosGetTimestampMs();
|
||||
|
@ -5930,7 +5964,7 @@ static void *readMetric(void *sarg) {
|
|||
fprintf(fp, "Querying On %d records:\n", totalData);
|
||||
|
||||
for (int j = 0; j < n; j++) {
|
||||
char condition[BUFFER_SIZE - 30] = "\0";
|
||||
char condition[COND_BUF_LEN] = "\0";
|
||||
char tempS[64] = "\0";
|
||||
|
||||
int m = 10 < num_of_tables ? 10 : num_of_tables;
|
||||
|
@ -5941,7 +5975,7 @@ static void *readMetric(void *sarg) {
|
|||
} else {
|
||||
sprintf(tempS, " or t1 = %d ", i);
|
||||
}
|
||||
strcat(condition, tempS);
|
||||
strncat(condition, tempS, COND_BUF_LEN - 1);
|
||||
|
||||
sprintf(command, "select %s from meters where %s", aggreFunc[j], condition);
|
||||
|
||||
|
@ -6119,43 +6153,24 @@ static void *specifiedTableQuery(void *sarg) {
|
|||
taosMsleep(g_queryInfo.specifiedQueryInfo.queryInterval - (et - st)); // ms
|
||||
}
|
||||
|
||||
st = taosGetTimestampMs();
|
||||
|
||||
if (0 == strncasecmp(g_queryInfo.queryMode, "taosc", strlen("taosc"))) {
|
||||
int64_t t1 = taosGetTimestampMs();
|
||||
char tmpFile[MAX_FILE_NAME_LEN*2] = {0};
|
||||
if (g_queryInfo.specifiedQueryInfo.result[pThreadInfo->querySeq][0] != 0) {
|
||||
sprintf(tmpFile, "%s-%d",
|
||||
g_queryInfo.specifiedQueryInfo.result[pThreadInfo->querySeq],
|
||||
pThreadInfo->threadID);
|
||||
}
|
||||
selectAndGetResult(pThreadInfo->taos,
|
||||
g_queryInfo.specifiedQueryInfo.sql[pThreadInfo->querySeq], tmpFile);
|
||||
int64_t t2 = taosGetTimestampMs();
|
||||
printf("=[taosc] thread[%"PRId64"] complete one sql, Spent %10.3f s\n",
|
||||
taosGetSelfPthreadId(), (t2 - t1)/1000.0);
|
||||
} else if (0 == strncasecmp(g_queryInfo.queryMode, "rest", strlen("rest"))) {
|
||||
int64_t t1 = taosGetTimestampMs();
|
||||
int retCode = postProceSql(g_queryInfo.host, &(g_queryInfo.serv_addr),
|
||||
g_queryInfo.port,
|
||||
g_queryInfo.specifiedQueryInfo.sql[pThreadInfo->querySeq]);
|
||||
if (0 != retCode) {
|
||||
printf("====restful return fail, threadID[%d]\n", pThreadInfo->threadID);
|
||||
return NULL;
|
||||
}
|
||||
int64_t t2 = taosGetTimestampMs();
|
||||
printf("=[restful] thread[%"PRId64"] complete one sql, Spent %10.3f s\n",
|
||||
taosGetSelfPthreadId(), (t2 - t1)/1000.0);
|
||||
|
||||
} else {
|
||||
errorPrint("%s() LN%d, unknown query mode: %s\n",
|
||||
__func__, __LINE__, g_queryInfo.queryMode);
|
||||
return NULL;
|
||||
}
|
||||
totalQueried ++;
|
||||
g_queryInfo.specifiedQueryInfo.totalQueried ++;
|
||||
st = taosGetTimestampMs();
|
||||
|
||||
selectAndGetResult(pThreadInfo,
|
||||
g_queryInfo.specifiedQueryInfo.sql[pThreadInfo->querySeq], tmpFile);
|
||||
|
||||
et = taosGetTimestampMs();
|
||||
printf("=thread[%"PRId64"] use %s complete one sql, Spent %10.3f s\n",
|
||||
taosGetSelfPthreadId(), g_queryInfo.queryMode, (et - st)/1000.0);
|
||||
|
||||
totalQueried ++;
|
||||
g_queryInfo.specifiedQueryInfo.totalQueried ++;
|
||||
|
||||
uint64_t currentPrintTime = taosGetTimestampMs();
|
||||
uint64_t endTs = taosGetTimestampMs();
|
||||
|
@ -6188,14 +6203,14 @@ static void replaceChildTblName(char* inSql, char* outSql, int tblIndex) {
|
|||
|
||||
tstrncpy(outSql, inSql, pos - inSql + 1);
|
||||
//printf("1: %s\n", outSql);
|
||||
strcat(outSql, subTblName);
|
||||
strncat(outSql, subTblName, MAX_QUERY_SQL_LENGTH - 1);
|
||||
//printf("2: %s\n", outSql);
|
||||
strcat(outSql, pos+strlen(sourceString));
|
||||
strncat(outSql, pos+strlen(sourceString), MAX_QUERY_SQL_LENGTH - 1);
|
||||
//printf("3: %s\n", outSql);
|
||||
}
|
||||
|
||||
static void *superTableQuery(void *sarg) {
|
||||
char sqlstr[1024];
|
||||
char sqlstr[MAX_QUERY_SQL_LENGTH];
|
||||
threadInfo *pThreadInfo = (threadInfo *)sarg;
|
||||
|
||||
if (pThreadInfo->taos == NULL) {
|
||||
|
@ -6240,7 +6255,7 @@ static void *superTableQuery(void *sarg) {
|
|||
g_queryInfo.superQueryInfo.result[j],
|
||||
pThreadInfo->threadID);
|
||||
}
|
||||
selectAndGetResult(pThreadInfo->taos, sqlstr, tmpFile);
|
||||
selectAndGetResult(pThreadInfo, sqlstr, tmpFile);
|
||||
|
||||
totalQueried++;
|
||||
g_queryInfo.superQueryInfo.totalQueried ++;
|
||||
|
@ -6441,7 +6456,8 @@ static void subscribe_callback(TAOS_SUB* tsub, TAOS_RES *res, void* param, int c
|
|||
return;
|
||||
}
|
||||
|
||||
getResult(res, (char*)param);
|
||||
if (param)
|
||||
appendResultToFile(res, (char*)param);
|
||||
// tao_unscribe() will free result.
|
||||
}
|
||||
|
||||
|
@ -6470,7 +6486,7 @@ static TAOS_SUB* subscribeImpl(
|
|||
|
||||
static void *superSubscribe(void *sarg) {
|
||||
threadInfo *pThreadInfo = (threadInfo *)sarg;
|
||||
char subSqlstr[1024];
|
||||
char subSqlstr[MAX_QUERY_SQL_LENGTH];
|
||||
TAOS_SUB* tsub[MAX_QUERY_SQL_COUNT] = {0};
|
||||
|
||||
if (g_queryInfo.superQueryInfo.sqlCount == 0)
|
||||
|
@ -6545,8 +6561,8 @@ static void *superSubscribe(void *sarg) {
|
|||
sprintf(tmpFile, "%s-%d",
|
||||
g_queryInfo.superQueryInfo.result[i],
|
||||
pThreadInfo->threadID);
|
||||
appendResultToFile(res, tmpFile);
|
||||
}
|
||||
getResult(res, tmpFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6633,8 +6649,8 @@ static void *specifiedSubscribe(void *sarg) {
|
|||
if (g_queryInfo.specifiedQueryInfo.result[i][0] != 0) {
|
||||
sprintf(tmpFile, "%s-%d",
|
||||
g_queryInfo.specifiedQueryInfo.result[i], pThreadInfo->threadID);
|
||||
appendResultToFile(res, tmpFile);
|
||||
}
|
||||
getResult(res, tmpFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -110,14 +110,14 @@ typedef struct {
|
|||
} SColDes;
|
||||
|
||||
typedef struct {
|
||||
char name[TSDB_COL_NAME_LEN + 1];
|
||||
char name[TSDB_TABLE_NAME_LEN];
|
||||
SColDes cols[];
|
||||
} STableDef;
|
||||
|
||||
extern char version[];
|
||||
|
||||
typedef struct {
|
||||
char name[TSDB_DB_NAME_LEN + 1];
|
||||
char name[TSDB_DB_NAME_LEN];
|
||||
char create_time[32];
|
||||
int32_t ntables;
|
||||
int32_t vgroups;
|
||||
|
@ -142,8 +142,8 @@ typedef struct {
|
|||
} SDbInfo;
|
||||
|
||||
typedef struct {
|
||||
char name[TSDB_TABLE_NAME_LEN + 1];
|
||||
char metric[TSDB_TABLE_NAME_LEN + 1];
|
||||
char name[TSDB_TABLE_NAME_LEN];
|
||||
char metric[TSDB_TABLE_NAME_LEN];
|
||||
} STableRecord;
|
||||
|
||||
typedef struct {
|
||||
|
@ -155,7 +155,7 @@ typedef struct {
|
|||
pthread_t threadID;
|
||||
int32_t threadIndex;
|
||||
int32_t totalThreads;
|
||||
char dbName[TSDB_TABLE_NAME_LEN + 1];
|
||||
char dbName[TSDB_DB_NAME_LEN];
|
||||
void *taosCon;
|
||||
int64_t rowsOfDumpOut;
|
||||
int64_t tablesOfDumpOut;
|
||||
|
@ -214,13 +214,13 @@ static struct argp_option options[] = {
|
|||
{"encode", 'e', "ENCODE", 0, "Input file encoding.", 1},
|
||||
// dump unit options
|
||||
{"all-databases", 'A', 0, 0, "Dump all databases.", 2},
|
||||
{"databases", 'B', 0, 0, "Dump assigned databases", 2},
|
||||
{"databases", 'D', 0, 0, "Dump assigned databases", 2},
|
||||
// dump format options
|
||||
{"schemaonly", 's', 0, 0, "Only dump schema.", 3},
|
||||
{"with-property", 'M', 0, 0, "Dump schema with properties.", 3},
|
||||
{"without-property", 'N', 0, 0, "Dump schema without properties.", 3},
|
||||
{"start-time", 'S', "START_TIME", 0, "Start time to dump. Either Epoch or ISO8601/RFC3339 format is acceptable. Epoch precision millisecond. ISO8601 format example: 2017-10-01T18:00:00.000+0800 or 2017-10-0100:00:00.000+0800 or '2017-10-01 00:00:00.000+0800'", 3},
|
||||
{"end-time", 'E', "END_TIME", 0, "End time to dump. Either Epoch or ISO8601/RFC3339 format is acceptable. Epoch precision millisecond. ISO8601 format example: 2017-10-01T18:00:00.000+0800 or 2017-10-0100:00:00.000+0800 or '2017-10-01 00:00:00.000+0800'", 3},
|
||||
{"data-batch", 'N', "DATA_BATCH", 0, "Number of data point per insert statement. Default is 1.", 3},
|
||||
{"data-batch", 'B', "DATA_BATCH", 0, "Number of data point per insert statement. Default is 1.", 3},
|
||||
{"max-sql-len", 'L', "SQL_LEN", 0, "Max length of one sql. Default is 65480.", 3},
|
||||
{"table-batch", 't', "TABLE_BATCH", 0, "Number of table dumpout into one output file. Default is 1.", 3},
|
||||
{"thread_num", 'T', "THREAD_NUM", 0, "Number of thread for dump in file. Default is 5.", 3},
|
||||
|
@ -341,15 +341,15 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
|||
case 'A':
|
||||
arguments->all_databases = true;
|
||||
break;
|
||||
case 'B':
|
||||
case 'D':
|
||||
arguments->databases = true;
|
||||
break;
|
||||
// dump format option
|
||||
case 's':
|
||||
arguments->schemaonly = true;
|
||||
break;
|
||||
case 'M':
|
||||
arguments->with_property = true;
|
||||
case 'N':
|
||||
arguments->with_property = false;
|
||||
break;
|
||||
case 'S':
|
||||
// parse time here.
|
||||
|
@ -358,7 +358,7 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
|||
case 'E':
|
||||
arguments->end_time = atol(arg);
|
||||
break;
|
||||
case 'N':
|
||||
case 'B':
|
||||
arguments->data_batch = atoi(arg);
|
||||
if (arguments->data_batch >= INT16_MAX) {
|
||||
arguments->data_batch = INT16_MAX - 1;
|
||||
|
@ -402,17 +402,17 @@ static resultStatistics g_resultStatistics = {0};
|
|||
static FILE *g_fpOfResult = NULL;
|
||||
static int g_numOfCores = 1;
|
||||
|
||||
int taosDumpOut(struct arguments *arguments);
|
||||
int taosDumpIn(struct arguments *arguments);
|
||||
void taosDumpCreateDbClause(SDbInfo *dbInfo, bool isDumpProperty, FILE *fp);
|
||||
int taosDumpDb(SDbInfo *dbInfo, struct arguments *arguments, FILE *fp, TAOS *taosCon);
|
||||
int32_t taosDumpStable(char *table, FILE *fp, TAOS* taosCon, char* dbName);
|
||||
void taosDumpCreateTableClause(STableDef *tableDes, int numOfCols, FILE *fp, char* dbName);
|
||||
void taosDumpCreateMTableClause(STableDef *tableDes, char *metric, int numOfCols, FILE *fp, char* dbName);
|
||||
int32_t taosDumpTable(char *table, char *metric, struct arguments *arguments, FILE *fp, TAOS* taosCon, char* dbName);
|
||||
int taosDumpTableData(FILE *fp, char *tbname, struct arguments *arguments, TAOS* taosCon, char* dbName);
|
||||
int taosCheckParam(struct arguments *arguments);
|
||||
void taosFreeDbInfos();
|
||||
static int taosDumpOut(struct arguments *arguments);
|
||||
static int taosDumpIn(struct arguments *arguments);
|
||||
static void taosDumpCreateDbClause(SDbInfo *dbInfo, bool isDumpProperty, FILE *fp);
|
||||
static int taosDumpDb(SDbInfo *dbInfo, struct arguments *arguments, FILE *fp, TAOS *taosCon);
|
||||
static int32_t taosDumpStable(char *table, FILE *fp, TAOS* taosCon, char* dbName);
|
||||
static void taosDumpCreateTableClause(STableDef *tableDes, int numOfCols, FILE *fp, char* dbName);
|
||||
static void taosDumpCreateMTableClause(STableDef *tableDes, char *metric, int numOfCols, FILE *fp, char* dbName);
|
||||
static int32_t taosDumpTable(char *table, char *metric, struct arguments *arguments, FILE *fp, TAOS* taosCon, char* dbName);
|
||||
static int taosDumpTableData(FILE *fp, char *tbname, struct arguments *arguments, TAOS* taosCon, char* dbName);
|
||||
static int taosCheckParam(struct arguments *arguments);
|
||||
static void taosFreeDbInfos();
|
||||
static void taosStartDumpOutWorkThreads(void* taosCon, struct arguments* args, int32_t numOfThread, char *dbName);
|
||||
|
||||
struct arguments g_args = {
|
||||
|
@ -436,8 +436,8 @@ struct arguments g_args = {
|
|||
false,
|
||||
false,
|
||||
// dump format option
|
||||
false,
|
||||
false,
|
||||
false, // schemeonly
|
||||
true, // with_property
|
||||
0,
|
||||
INT64_MAX,
|
||||
1,
|
||||
|
@ -959,7 +959,8 @@ int taosDumpOut(struct arguments *arguments) {
|
|||
goto _exit_failure;
|
||||
}
|
||||
|
||||
strncpy(dbInfos[count]->name, (char *)row[TSDB_SHOW_DB_NAME_INDEX], fields[TSDB_SHOW_DB_NAME_INDEX].bytes);
|
||||
strncpy(dbInfos[count]->name, (char *)row[TSDB_SHOW_DB_NAME_INDEX],
|
||||
fields[TSDB_SHOW_DB_NAME_INDEX].bytes);
|
||||
if (arguments->with_property) {
|
||||
dbInfos[count]->ntables = *((int32_t *)row[TSDB_SHOW_DB_NTABLES_INDEX]);
|
||||
dbInfos[count]->vgroups = *((int32_t *)row[TSDB_SHOW_DB_VGROUPS_INDEX]);
|
||||
|
@ -967,7 +968,8 @@ int taosDumpOut(struct arguments *arguments) {
|
|||
dbInfos[count]->quorum = *((int16_t *)row[TSDB_SHOW_DB_QUORUM_INDEX]);
|
||||
dbInfos[count]->days = *((int16_t *)row[TSDB_SHOW_DB_DAYS_INDEX]);
|
||||
|
||||
strncpy(dbInfos[count]->keeplist, (char *)row[TSDB_SHOW_DB_KEEP_INDEX], fields[TSDB_SHOW_DB_KEEP_INDEX].bytes);
|
||||
strncpy(dbInfos[count]->keeplist, (char *)row[TSDB_SHOW_DB_KEEP_INDEX],
|
||||
fields[TSDB_SHOW_DB_KEEP_INDEX].bytes);
|
||||
//dbInfos[count]->daysToKeep = *((int16_t *)row[TSDB_SHOW_DB_KEEP_INDEX]);
|
||||
//dbInfos[count]->daysToKeep1;
|
||||
//dbInfos[count]->daysToKeep2;
|
||||
|
@ -980,7 +982,8 @@ int taosDumpOut(struct arguments *arguments) {
|
|||
dbInfos[count]->comp = (int8_t)(*((int8_t *)row[TSDB_SHOW_DB_COMP_INDEX]));
|
||||
dbInfos[count]->cachelast = (int8_t)(*((int8_t *)row[TSDB_SHOW_DB_CACHELAST_INDEX]));
|
||||
|
||||
strncpy(dbInfos[count]->precision, (char *)row[TSDB_SHOW_DB_PRECISION_INDEX], fields[TSDB_SHOW_DB_PRECISION_INDEX].bytes);
|
||||
strncpy(dbInfos[count]->precision, (char *)row[TSDB_SHOW_DB_PRECISION_INDEX],
|
||||
fields[TSDB_SHOW_DB_PRECISION_INDEX].bytes);
|
||||
//dbInfos[count]->precision = *((int8_t *)row[TSDB_SHOW_DB_PRECISION_INDEX]);
|
||||
dbInfos[count]->update = *((int8_t *)row[TSDB_SHOW_DB_UPDATE_INDEX]);
|
||||
}
|
||||
|
@ -1095,7 +1098,9 @@ _exit_failure:
|
|||
return -1;
|
||||
}
|
||||
|
||||
int taosGetTableDes(char* dbName, char *table, STableDef *tableDes, TAOS* taosCon, bool isSuperTable) {
|
||||
int taosGetTableDes(
|
||||
char* dbName, char *table,
|
||||
STableDef *tableDes, TAOS* taosCon, bool isSuperTable) {
|
||||
TAOS_ROW row = NULL;
|
||||
TAOS_RES* res = NULL;
|
||||
int count = 0;
|
||||
|
@ -1113,7 +1118,7 @@ int taosGetTableDes(char* dbName, char *table, STableDef *tableDes, TAOS* taosCo
|
|||
|
||||
TAOS_FIELD *fields = taos_fetch_fields(res);
|
||||
|
||||
tstrncpy(tableDes->name, table, TSDB_COL_NAME_LEN);
|
||||
tstrncpy(tableDes->name, table, TSDB_TABLE_NAME_LEN);
|
||||
|
||||
while ((row = taos_fetch_row(res)) != NULL) {
|
||||
strncpy(tableDes->cols[count].field, (char *)row[TSDB_DESCRIBE_METRIC_FIELD_INDEX],
|
||||
|
@ -1232,7 +1237,9 @@ int taosGetTableDes(char* dbName, char *table, STableDef *tableDes, TAOS* taosCo
|
|||
return count;
|
||||
}
|
||||
|
||||
int32_t taosDumpTable(char *table, char *metric, struct arguments *arguments, FILE *fp, TAOS* taosCon, char* dbName) {
|
||||
int32_t taosDumpTable(
|
||||
char *table, char *metric, struct arguments *arguments,
|
||||
FILE *fp, TAOS* taosCon, char* dbName) {
|
||||
int count = 0;
|
||||
|
||||
STableDef *tableDes = (STableDef *)calloc(1, sizeof(STableDef) + sizeof(SColDes) * TSDB_MAX_COLUMNS);
|
||||
|
@ -1346,14 +1353,17 @@ void* taosDumpOutWorkThreadFp(void *arg)
|
|||
ssize_t readLen = read(fd, &tableRecord, sizeof(STableRecord));
|
||||
if (readLen <= 0) break;
|
||||
|
||||
int ret = taosDumpTable(tableRecord.name, tableRecord.metric, &g_args, fp, pThread->taosCon, pThread->dbName);
|
||||
int ret = taosDumpTable(
|
||||
tableRecord.name, tableRecord.metric, &g_args,
|
||||
fp, pThread->taosCon, pThread->dbName);
|
||||
if (ret >= 0) {
|
||||
// TODO: sum table count and table rows by self
|
||||
pThread->tablesOfDumpOut++;
|
||||
pThread->rowsOfDumpOut += ret;
|
||||
|
||||
if (pThread->rowsOfDumpOut >= lastRowsPrint) {
|
||||
printf(" %"PRId64 " rows already be dumpout from database %s\n", pThread->rowsOfDumpOut, pThread->dbName);
|
||||
printf(" %"PRId64 " rows already be dumpout from database %s\n",
|
||||
pThread->rowsOfDumpOut, pThread->dbName);
|
||||
lastRowsPrint += 5000000;
|
||||
}
|
||||
|
||||
|
@ -1364,9 +1374,12 @@ void* taosDumpOutWorkThreadFp(void *arg)
|
|||
|
||||
memset(tmpBuf, 0, TSDB_FILENAME_LEN + 128);
|
||||
if (g_args.outpath[0] != 0) {
|
||||
sprintf(tmpBuf, "%s/%s.tables.%d-%d.sql", g_args.outpath, pThread->dbName, pThread->threadIndex, fileNameIndex);
|
||||
sprintf(tmpBuf, "%s/%s.tables.%d-%d.sql",
|
||||
g_args.outpath, pThread->dbName,
|
||||
pThread->threadIndex, fileNameIndex);
|
||||
} else {
|
||||
sprintf(tmpBuf, "%s.tables.%d-%d.sql", pThread->dbName, pThread->threadIndex, fileNameIndex);
|
||||
sprintf(tmpBuf, "%s.tables.%d-%d.sql",
|
||||
pThread->dbName, pThread->threadIndex, fileNameIndex);
|
||||
}
|
||||
fileNameIndex++;
|
||||
|
||||
|
@ -1391,14 +1404,15 @@ void* taosDumpOutWorkThreadFp(void *arg)
|
|||
static void taosStartDumpOutWorkThreads(void* taosCon, struct arguments* args, int32_t numOfThread, char *dbName)
|
||||
{
|
||||
pthread_attr_t thattr;
|
||||
SThreadParaObj *threadObj = (SThreadParaObj *)calloc(numOfThread, sizeof(SThreadParaObj));
|
||||
SThreadParaObj *threadObj =
|
||||
(SThreadParaObj *)calloc(numOfThread, sizeof(SThreadParaObj));
|
||||
for (int t = 0; t < numOfThread; ++t) {
|
||||
SThreadParaObj *pThread = threadObj + t;
|
||||
pThread->rowsOfDumpOut = 0;
|
||||
pThread->tablesOfDumpOut = 0;
|
||||
pThread->threadIndex = t;
|
||||
pThread->totalThreads = numOfThread;
|
||||
tstrncpy(pThread->dbName, dbName, TSDB_TABLE_NAME_LEN);
|
||||
tstrncpy(pThread->dbName, dbName, TSDB_DB_NAME_LEN);
|
||||
pThread->taosCon = taosCon;
|
||||
|
||||
pthread_attr_init(&thattr);
|
||||
|
@ -1487,7 +1501,8 @@ int32_t taosDumpCreateSuperTableClause(TAOS* taosCon, char* dbName, FILE *fp)
|
|||
|
||||
while ((row = taos_fetch_row(res)) != NULL) {
|
||||
memset(&tableRecord, 0, sizeof(STableRecord));
|
||||
strncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX], fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes);
|
||||
strncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX],
|
||||
fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes);
|
||||
taosWrite(fd, &tableRecord, sizeof(STableRecord));
|
||||
}
|
||||
|
||||
|
@ -1557,8 +1572,10 @@ int taosDumpDb(SDbInfo *dbInfo, struct arguments *arguments, FILE *fp, TAOS *tao
|
|||
int32_t numOfTable = 0;
|
||||
while ((row = taos_fetch_row(res)) != NULL) {
|
||||
memset(&tableRecord, 0, sizeof(STableRecord));
|
||||
tstrncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX], fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes);
|
||||
tstrncpy(tableRecord.metric, (char *)row[TSDB_SHOW_TABLES_METRIC_INDEX], fields[TSDB_SHOW_TABLES_METRIC_INDEX].bytes);
|
||||
tstrncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX],
|
||||
fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes);
|
||||
tstrncpy(tableRecord.metric, (char *)row[TSDB_SHOW_TABLES_METRIC_INDEX],
|
||||
fields[TSDB_SHOW_TABLES_METRIC_INDEX].bytes);
|
||||
|
||||
taosWrite(fd, &tableRecord, sizeof(STableRecord));
|
||||
|
||||
|
@ -1643,15 +1660,18 @@ void taosDumpCreateTableClause(STableDef *tableDes, int numOfCols, FILE *fp, cha
|
|||
|
||||
char* pstr = sqlstr;
|
||||
|
||||
pstr += sprintf(sqlstr, "CREATE TABLE IF NOT EXISTS %s.%s", dbName, tableDes->name);
|
||||
pstr += sprintf(sqlstr, "CREATE TABLE IF NOT EXISTS %s.%s",
|
||||
dbName, tableDes->name);
|
||||
|
||||
for (; counter < numOfCols; counter++) {
|
||||
if (tableDes->cols[counter].note[0] != '\0') break;
|
||||
|
||||
if (counter == 0) {
|
||||
pstr += sprintf(pstr, " (%s %s", tableDes->cols[counter].field, tableDes->cols[counter].type);
|
||||
pstr += sprintf(pstr, " (%s %s",
|
||||
tableDes->cols[counter].field, tableDes->cols[counter].type);
|
||||
} else {
|
||||
pstr += sprintf(pstr, ", %s %s", tableDes->cols[counter].field, tableDes->cols[counter].type);
|
||||
pstr += sprintf(pstr, ", %s %s",
|
||||
tableDes->cols[counter].field, tableDes->cols[counter].type);
|
||||
}
|
||||
|
||||
if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 ||
|
||||
|
@ -1664,9 +1684,11 @@ void taosDumpCreateTableClause(STableDef *tableDes, int numOfCols, FILE *fp, cha
|
|||
|
||||
for (; counter < numOfCols; counter++) {
|
||||
if (counter == count_temp) {
|
||||
pstr += sprintf(pstr, ") TAGS (%s %s", tableDes->cols[counter].field, tableDes->cols[counter].type);
|
||||
pstr += sprintf(pstr, ") TAGS (%s %s",
|
||||
tableDes->cols[counter].field, tableDes->cols[counter].type);
|
||||
} else {
|
||||
pstr += sprintf(pstr, ", %s %s", tableDes->cols[counter].field, tableDes->cols[counter].type);
|
||||
pstr += sprintf(pstr, ", %s %s",
|
||||
tableDes->cols[counter].field, tableDes->cols[counter].type);
|
||||
}
|
||||
|
||||
if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 ||
|
||||
|
@ -1693,7 +1715,8 @@ void taosDumpCreateMTableClause(STableDef *tableDes, char *metric, int numOfCols
|
|||
char *pstr = NULL;
|
||||
pstr = tmpBuf;
|
||||
|
||||
pstr += sprintf(tmpBuf, "CREATE TABLE IF NOT EXISTS %s.%s USING %s.%s TAGS (", dbName, tableDes->name, dbName, metric);
|
||||
pstr += sprintf(tmpBuf, "CREATE TABLE IF NOT EXISTS %s.%s USING %s.%s TAGS (",
|
||||
dbName, tableDes->name, dbName, metric);
|
||||
|
||||
for (; counter < numOfCols; counter++) {
|
||||
if (tableDes->cols[counter].note[0] != '\0') break;
|
||||
|
|
|
@ -249,7 +249,7 @@ typedef struct SAcctObj {
|
|||
} SAcctObj;
|
||||
|
||||
typedef struct {
|
||||
char db[TSDB_DB_NAME_LEN];
|
||||
char db[TSDB_ACCT_ID_LEN + TSDB_DB_NAME_LEN];
|
||||
int8_t type;
|
||||
int16_t numOfColumns;
|
||||
int32_t index;
|
||||
|
|
|
@ -129,7 +129,7 @@ static int32_t mnodeProcessShowMsg(SMnodeMsg *pMsg) {
|
|||
SShowObj *pShow = calloc(1, showObjSize);
|
||||
pShow->type = pShowMsg->type;
|
||||
pShow->payloadLen = htons(pShowMsg->payloadLen);
|
||||
tstrncpy(pShow->db, pShowMsg->db, TSDB_DB_NAME_LEN);
|
||||
tstrncpy(pShow->db, pShowMsg->db, TSDB_ACCT_ID_LEN + TSDB_DB_NAME_LEN);
|
||||
memcpy(pShow->payload, pShowMsg->payload, pShow->payloadLen);
|
||||
|
||||
pShow = mnodePutShowObj(pShow);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include <iostream>
|
||||
|
||||
#include "taos.h"
|
||||
#include "tstoken.h"
|
||||
#include "ttoken.h"
|
||||
#include "tutil.h"
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
|
|
|
@ -22,8 +22,8 @@ extern "C" {
|
|||
|
||||
#include "taos.h"
|
||||
#include "taosmsg.h"
|
||||
#include "tstoken.h"
|
||||
#include "tstrbuild.h"
|
||||
#include "ttoken.h"
|
||||
#include "tvariant.h"
|
||||
|
||||
#define ParseTOKENTYPE SStrToken
|
||||
|
|
|
@ -13,13 +13,13 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "os.h"
|
||||
#include "qSqlparser.h"
|
||||
#include "os.h"
|
||||
#include "taosdef.h"
|
||||
#include "taosmsg.h"
|
||||
#include "tcmdtype.h"
|
||||
#include "tstoken.h"
|
||||
#include "tstrbuild.h"
|
||||
#include "ttoken.h"
|
||||
#include "ttokendef.h"
|
||||
#include "tutil.h"
|
||||
|
||||
|
@ -38,7 +38,7 @@ SSqlInfo qSqlParse(const char *pStr) {
|
|||
goto abort_parse;
|
||||
}
|
||||
|
||||
t0.n = tSQLGetToken((char *)&pStr[i], &t0.type);
|
||||
t0.n = tGetToken((char *)&pStr[i], &t0.type);
|
||||
t0.z = (char *)(pStr + i);
|
||||
i += t0.n;
|
||||
|
||||
|
|
|
@ -25,14 +25,14 @@
|
|||
#include <stdio.h>
|
||||
/************ Begin %include sections from the grammar ************************/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include "qSqlparser.h"
|
||||
#include "tcmdtype.h"
|
||||
#include "tstoken.h"
|
||||
#include "ttoken.h"
|
||||
#include "ttokendef.h"
|
||||
#include "tutil.h"
|
||||
#include "tvariant.h"
|
||||
|
|
|
@ -3,10 +3,10 @@
|
|||
#include <cassert>
|
||||
#include <iostream>
|
||||
|
||||
#include "qTsbuf.h"
|
||||
#include "taos.h"
|
||||
#include "tsdb.h"
|
||||
#include "qTsbuf.h"
|
||||
#include "tstoken.h"
|
||||
#include "ttoken.h"
|
||||
#include "tutil.h"
|
||||
|
||||
namespace {
|
||||
|
|
|
@ -21,7 +21,7 @@ int32_t testValidateName(char* name) {
|
|||
token.n = strlen(name);
|
||||
token.type = 0;
|
||||
|
||||
tSQLGetToken(name, &token.type);
|
||||
tGetToken(name, &token.type);
|
||||
return tscValidateName(&token);
|
||||
}
|
||||
}
|
||||
|
@ -691,32 +691,32 @@ TEST(testCase, tGetToken_Test) {
|
|||
char* s = ".123 ";
|
||||
uint32_t type = 0;
|
||||
|
||||
int32_t len = tSQLGetToken(s, &type);
|
||||
int32_t len = tGetToken(s, &type);
|
||||
EXPECT_EQ(type, TK_FLOAT);
|
||||
EXPECT_EQ(len, strlen(s) - 1);
|
||||
|
||||
char s1[] = "1.123e10 ";
|
||||
len = tSQLGetToken(s1, &type);
|
||||
len = tGetToken(s1, &type);
|
||||
EXPECT_EQ(type, TK_FLOAT);
|
||||
EXPECT_EQ(len, strlen(s1) - 1);
|
||||
|
||||
char s4[] = "0xff ";
|
||||
len = tSQLGetToken(s4, &type);
|
||||
len = tGetToken(s4, &type);
|
||||
EXPECT_EQ(type, TK_HEX);
|
||||
EXPECT_EQ(len, strlen(s4) - 1);
|
||||
|
||||
// invalid data type
|
||||
char s2[] = "e10 ";
|
||||
len = tSQLGetToken(s2, &type);
|
||||
len = tGetToken(s2, &type);
|
||||
EXPECT_FALSE(type == TK_FLOAT);
|
||||
|
||||
char s3[] = "1.1.1.1";
|
||||
len = tSQLGetToken(s3, &type);
|
||||
len = tGetToken(s3, &type);
|
||||
EXPECT_EQ(type, TK_IPTOKEN);
|
||||
EXPECT_EQ(len, strlen(s3));
|
||||
|
||||
char s5[] = "0x ";
|
||||
len = tSQLGetToken(s5, &type);
|
||||
len = tGetToken(s5, &type);
|
||||
EXPECT_FALSE(type == TK_HEX);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,13 +37,25 @@ typedef struct SStrToken {
|
|||
char *z;
|
||||
} SStrToken;
|
||||
|
||||
extern const char escapeChar[];
|
||||
|
||||
/**
|
||||
* check if it is a number or not
|
||||
* @param pToken
|
||||
* @return
|
||||
*/
|
||||
#define isNumber(tk) \
|
||||
((tk)->type == TK_INTEGER || (tk)->type == TK_FLOAT || (tk)->type == TK_HEX || (tk)->type == TK_BIN)
|
||||
|
||||
#define GET_ESCAPE_CHAR(c) (escapeChar[(uint8_t)(c)])
|
||||
|
||||
/**
|
||||
* tokenizer for sql string
|
||||
* @param z
|
||||
* @param tokenType
|
||||
* @return
|
||||
*/
|
||||
uint32_t tSQLGetToken(char *z, uint32_t *tokenType);
|
||||
uint32_t tGetToken(char *z, uint32_t *tokenType);
|
||||
|
||||
/**
|
||||
* enhanced tokenizer for sql string.
|
||||
|
@ -61,16 +73,7 @@ SStrToken tStrGetToken(char *str, int32_t *i, bool isPrevOptr);
|
|||
* @param len
|
||||
* @return
|
||||
*/
|
||||
bool isKeyWord(const char *z, int32_t len);
|
||||
|
||||
/**
|
||||
* check if it is a number or not
|
||||
* @param pToken
|
||||
* @return
|
||||
*/
|
||||
#define isNumber(tk) \
|
||||
((tk)->type == TK_INTEGER || (tk)->type == TK_FLOAT || (tk)->type == TK_HEX || (tk)->type == TK_BIN)
|
||||
|
||||
bool taosIsKeyWordToken(const char *z, int32_t len);
|
||||
|
||||
/**
|
||||
* check if it is a token or not
|
|
@ -18,7 +18,7 @@
|
|||
#include "hash.h"
|
||||
#include "hashfunc.h"
|
||||
#include "taosdef.h"
|
||||
#include "tstoken.h"
|
||||
#include "ttoken.h"
|
||||
#include "ttokendef.h"
|
||||
#include "tutil.h"
|
||||
|
||||
|
@ -232,6 +232,18 @@ static const char isIdChar[] = {
|
|||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */
|
||||
};
|
||||
|
||||
const char escapeChar[] = {
|
||||
/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* 0x */
|
||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, /* 1x */
|
||||
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, /* 2x */
|
||||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, /* 3x */
|
||||
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,/* 4x */
|
||||
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,/* 5x */
|
||||
0x60, 0x07, 0x08, 0x63, 0x64, 0x65, 0x0C, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x0A, 0x6F,/* 6x */
|
||||
0x70, 0x71, 0x0D, 0x73, 0x09, 0x75, 0x0B, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,/* 7x */
|
||||
};
|
||||
|
||||
static void* keywordHashTable = NULL;
|
||||
|
||||
static void doInitKeywordsTable(void) {
|
||||
|
@ -247,7 +259,7 @@ static void doInitKeywordsTable(void) {
|
|||
|
||||
static pthread_once_t keywordsHashTableInit = PTHREAD_ONCE_INIT;
|
||||
|
||||
int tSQLKeywordCode(const char* z, int n) {
|
||||
static int32_t tKeywordCode(const char* z, int n) {
|
||||
pthread_once(&keywordsHashTableInit, doInitKeywordsTable);
|
||||
|
||||
char key[512] = {0};
|
||||
|
@ -271,7 +283,7 @@ int tSQLKeywordCode(const char* z, int n) {
|
|||
* Return the length of the token that begins at z[0].
|
||||
* Store the token type in *type before returning.
|
||||
*/
|
||||
uint32_t tSQLGetToken(char* z, uint32_t* tokenId) {
|
||||
uint32_t tGetToken(char* z, uint32_t* tokenId) {
|
||||
uint32_t i;
|
||||
switch (*z) {
|
||||
case ' ':
|
||||
|
@ -403,12 +415,12 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenId) {
|
|||
int delim = z[0];
|
||||
bool strEnd = false;
|
||||
for (i = 1; z[i]; i++) {
|
||||
if (z[i] == '\\') {
|
||||
if (z[i] == '\\') { // ignore the escaped character that follows this backslash
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (z[i] == delim ) {
|
||||
if (z[i] == delim) {
|
||||
if (z[i + 1] == delim) {
|
||||
i++;
|
||||
} else {
|
||||
|
@ -551,7 +563,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenId) {
|
|||
}
|
||||
for (i = 1; ((z[i] & 0x80) == 0) && isIdChar[(uint8_t) z[i]]; i++) {
|
||||
}
|
||||
*tokenId = tSQLKeywordCode(z, i);
|
||||
*tokenId = tKeywordCode(z, i);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
@ -584,7 +596,7 @@ SStrToken tStrGetToken(char* str, int32_t* i, bool isPrevOptr) {
|
|||
t = str[++(*i)];
|
||||
}
|
||||
|
||||
t0.n = tSQLGetToken(&str[*i], &t0.type);
|
||||
t0.n = tGetToken(&str[*i], &t0.type);
|
||||
break;
|
||||
|
||||
// not support user specfied ignored symbol list
|
||||
|
@ -613,7 +625,7 @@ SStrToken tStrGetToken(char* str, int32_t* i, bool isPrevOptr) {
|
|||
|
||||
// support parse the 'db.tbl' format, notes: There should be no space on either side of the dot!
|
||||
if ('.' == str[*i + t0.n]) {
|
||||
len = tSQLGetToken(&str[*i + t0.n + 1], &type);
|
||||
len = tGetToken(&str[*i + t0.n + 1], &type);
|
||||
|
||||
// only id and string are valid
|
||||
if ((TK_STRING != t0.type) && (TK_ID != t0.type)) {
|
||||
|
@ -628,7 +640,7 @@ SStrToken tStrGetToken(char* str, int32_t* i, bool isPrevOptr) {
|
|||
} else {
|
||||
// support parse the -/+number format
|
||||
if ((isPrevOptr) && (t0.type == TK_MINUS || t0.type == TK_PLUS)) {
|
||||
len = tSQLGetToken(&str[*i + t0.n], &type);
|
||||
len = tGetToken(&str[*i + t0.n], &type);
|
||||
if (type == TK_INTEGER || type == TK_FLOAT) {
|
||||
t0.type = type;
|
||||
t0.n += len;
|
||||
|
@ -642,7 +654,9 @@ SStrToken tStrGetToken(char* str, int32_t* i, bool isPrevOptr) {
|
|||
return t0;
|
||||
}
|
||||
|
||||
bool isKeyWord(const char* z, int32_t len) { return (tSQLKeywordCode((char*)z, len) != TK_ID); }
|
||||
bool taosIsKeyWordToken(const char* z, int32_t len) {
|
||||
return (tKeywordCode((char*)z, len) != TK_ID);
|
||||
}
|
||||
|
||||
void taosCleanupKeywordsTable() {
|
||||
void* m = keywordHashTable;
|
|
@ -305,6 +305,7 @@ python3 ./test.py -f functions/function_top.py -r 1
|
|||
python3 ./test.py -f functions/function_twa.py -r 1
|
||||
python3 ./test.py -f functions/function_twa_test2.py
|
||||
python3 ./test.py -f functions/function_stddev_td2555.py
|
||||
python3 ./test.py -f functions/showOfflineThresholdIs864000.py
|
||||
python3 ./test.py -f insert/metadataUpdate.py
|
||||
python3 ./test.py -f query/last_cache.py
|
||||
python3 ./test.py -f query/last_row_cache.py
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
###################################################################
|
||||
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This file is proprietary and confidential to TAOS Technologies.
|
||||
# No part of this file may be reproduced, stored, transmitted,
|
||||
# disclosed or used in any form or by any means other than as
|
||||
# expressly provided by the written permission from Jianhui Tao
|
||||
#
|
||||
###################################################################
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import sys
|
||||
from util.log import *
|
||||
from util.cases import *
|
||||
from util.sql import *
|
||||
from util.dnodes import *
|
||||
|
||||
|
||||
class TDTestCase:
|
||||
def init(self, conn, logSql):
|
||||
tdLog.debug(f"start to execute {__file__}")
|
||||
tdSql.init(conn.cursor(), logSql)
|
||||
|
||||
def run(self):
|
||||
tdSql.query("show variables")
|
||||
tdSql.checkData(51, 1, 864000)
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -57,12 +57,15 @@ class TDTestCase:
|
|||
|
||||
# https://www.ltg.ed.ac.uk/~richard/unicode-sample.html
|
||||
# Basic Latin
|
||||
data = r'! # $ % & ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~'
|
||||
data = r'! # $ % & ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~'
|
||||
tdLog.info("insert Basic Latin %d length data: %s" % (len(data), data))
|
||||
tdSql.execute("insert into tb values (now, '%s')" % data)
|
||||
tdSql.query("select * from tb")
|
||||
tdSql.checkRows(3)
|
||||
|
||||
data = data.replace('\\\\', '\\')
|
||||
tdSql.checkData(2, 1, data)
|
||||
# tdSql.execute("insert into tb values(now, 'abc')")
|
||||
|
||||
# Latin-1 Supplement
|
||||
data = ' ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ'
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
"confirm_parameter_prompt": "no",
|
||||
"databases": "db",
|
||||
"query_times": 2,
|
||||
"query_mode": "restful",
|
||||
"query_mode": "rest",
|
||||
"specified_table_query": {
|
||||
"query_interval": 1,
|
||||
"concurrent": 3,
|
||||
|
|
|
@ -93,5 +93,15 @@ if $data41 != @udp005@ then
|
|||
print "[ERROR] expect: udp005, act:$data41"
|
||||
endi
|
||||
|
||||
print ---------------------> TD-3967
|
||||
sql insert into tb values(now, '\\abc\\\\');
|
||||
sql insert into tb values(now, '\\abc\\\\');
|
||||
sql insert into tb values(now, '\\\\');
|
||||
|
||||
print ------------->sim bug
|
||||
# sql_error insert into tb values(now, '\\\');
|
||||
sql_error insert into tb values(now, '\');
|
||||
#sql_error insert into tb values(now, '\\\n');
|
||||
sql insert into tb values(now, '\n');
|
||||
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
|
@ -54,5 +54,9 @@ run general/parser/timestamp.sim
|
|||
run general/parser/sliding.sim
|
||||
run general/parser/function.sim
|
||||
run general/parser/stableOp.sim
|
||||
|
||||
run general/parser/having.sim
|
||||
run general/parser/having_child.sim
|
||||
run general/parser/slimit_alter_tags.sim
|
||||
run general/parser/binary_escapeCharacter.sim
|
||||
|
||||
|
|
Loading…
Reference in New Issue