diff --git a/src/kit/taosdemo/taosdemo.c b/src/kit/taosdemo/taosdemo.c
index f8e6e59863e7748b3752e6afb56cbd4242bb43f2..fa062c3f3ebf8e98f27dc27b5787b3790f8f2aae 100644
--- a/src/kit/taosdemo/taosdemo.c
+++ b/src/kit/taosdemo/taosdemo.c
@@ -986,36 +986,55 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
arguments->performance_print = true;
} else if ((0 == strncmp(argv[i], "-P", strlen("-P")))
|| (0 == strncmp(argv[i], "--port", strlen("--port")))) {
+ uint64_t port;
+ char strPort[BIGINT_BUFF_LEN];
+
if (2 == strlen(argv[i])) {
if (argc == i+1) {
errorPrintReqArg(argv[0], "P");
exit(EXIT_FAILURE);
- } else if (!isStringNumber(argv[i+1])) {
+ } else if (isStringNumber(argv[i+1])) {
+ tstrncpy(strPort, argv[++i], BIGINT_BUFF_LEN);
+ } else {
errorPrintReqArg2(argv[0], "P");
exit(EXIT_FAILURE);
}
- arguments->port = atoi(argv[++i]);
} else if (0 == strncmp(argv[i], "--port=", strlen("--port="))) {
if (isStringNumber((char *)(argv[i] + strlen("--port=")))) {
- arguments->port = atoi((char *)(argv[i]+strlen("--port=")));
+ tstrncpy(strPort, (char *)(argv[i]+strlen("--port=")), BIGINT_BUFF_LEN);
+ } else {
+ errorPrintReqArg2(argv[0], "--port");
+ exit(EXIT_FAILURE);
}
} else if (0 == strncmp(argv[i], "-P", strlen("-P"))) {
if (isStringNumber((char *)(argv[i] + strlen("-P")))) {
- arguments->port = atoi((char *)(argv[i]+strlen("-P")));
+ tstrncpy(strPort, (char *)(argv[i]+strlen("-P")), BIGINT_BUFF_LEN);
+ } else {
+ errorPrintReqArg2(argv[0], "--port");
+ exit(EXIT_FAILURE);
}
} else if (strlen("--port") == strlen(argv[i])) {
if (argc == i+1) {
errorPrintReqArg3(argv[0], "--port");
exit(EXIT_FAILURE);
- } else if (!isStringNumber(argv[i+1])) {
+ } else if (isStringNumber(argv[i+1])) {
+ tstrncpy(strPort, argv[++i], BIGINT_BUFF_LEN);
+ } else {
errorPrintReqArg2(argv[0], "--port");
exit(EXIT_FAILURE);
}
- arguments->port = atoi(argv[++i]);
} else {
errorUnrecognized(argv[0], argv[i]);
exit(EXIT_FAILURE);
}
+
+ port = atoi(strPort);
+ if (port > 65535) {
+ errorWrongValue("taosdump", "-P or --port", strPort);
+ exit(EXIT_FAILURE);
+ }
+ arguments->port = (uint16_t)port;
+
} else if ((0 == strncmp(argv[i], "-I", strlen("-I")))
|| (0 == strncmp(argv[i], "--interface", strlen("--interface")))) {
if (2 == strlen(argv[i])) {
@@ -1581,7 +1600,9 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
&& strcasecmp(dataType, "BIGINT")
&& strcasecmp(dataType, "DOUBLE")
&& strcasecmp(dataType, "TIMESTAMP")
- && !regexMatch(dataType, "^(NCHAR|BINARY)(\\([1-9][0-9]*\\))?$", REG_ICASE | REG_EXTENDED)
+ && !regexMatch(dataType,
+ "^(NCHAR|BINARY)(\\([1-9][0-9]*\\))?$",
+ REG_ICASE | REG_EXTENDED)
&& strcasecmp(dataType, "UTINYINT")
&& strcasecmp(dataType, "USMALLINT")
&& strcasecmp(dataType, "UINT")
@@ -1603,11 +1624,13 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
arguments->data_type[0] = TSDB_DATA_TYPE_FLOAT;
} else if (0 == strcasecmp(dataType, "DOUBLE")) {
arguments->data_type[0] = TSDB_DATA_TYPE_DOUBLE;
- } else if (1 == regexMatch(dataType, "^BINARY(\\([1-9][0-9]*\\))?$", REG_ICASE |
- REG_EXTENDED)) {
+ } else if (1 == regexMatch(dataType,
+ "^BINARY(\\([1-9][0-9]*\\))?$",
+ REG_ICASE | REG_EXTENDED)) {
arguments->data_type[0] = TSDB_DATA_TYPE_BINARY;
- } else if (1 == regexMatch(dataType, "^NCHAR(\\([1-9][0-9]*\\))?$", REG_ICASE |
- REG_EXTENDED)) {
+ } else if (1 == regexMatch(dataType,
+ "^NCHAR(\\([1-9][0-9]*\\))?$",
+ REG_ICASE | REG_EXTENDED)) {
arguments->data_type[0] = TSDB_DATA_TYPE_NCHAR;
} else if (0 == strcasecmp(dataType, "BOOL")) {
arguments->data_type[0] = TSDB_DATA_TYPE_BOOL;
@@ -10280,7 +10303,7 @@ static void startMultiThreadInsertData(int threads, char* db_name,
&stbInfo->childTblName, &childTblCount,
limit,
offset);
- ntables = childTblCount; // CBD
+ ntables = childTblCount;
} else {
ntables = g_args.ntables;
tableFrom = 0;
@@ -11833,7 +11856,7 @@ static void setParaFromArg() {
g_Dbs.db[0].superTbls[0].columns[i].data_type = data_type[i];
tstrncpy(g_Dbs.db[0].superTbls[0].columns[i].dataType,
dataType[i], min(DATATYPE_BUFF_LEN, strlen(dataType[i]) + 1));
- if (1 == regexMatch(dataType[i], "^(NCHAR|BINARY)(\\([1-9][0-9]*\\))$", REG_ICASE |
+ if (1 == regexMatch(dataType[i], "^(NCHAR|BINARY)(\\([1-9][0-9]*\\))$", REG_ICASE |
REG_EXTENDED)) {
sscanf(dataType[i], "%[^(](%[^)]", type, length);
g_Dbs.db[0].superTbls[0].columns[i].dataLen = atoi(length);
@@ -11842,7 +11865,7 @@ static void setParaFromArg() {
} else {
g_Dbs.db[0].superTbls[0].columns[i].dataLen = g_args.binwidth;
tstrncpy(g_Dbs.db[0].superTbls[0].columns[i].dataType,
- dataType[i], min(DATATYPE_BUFF_LEN, strlen(dataType[i]) + 1));
+ dataType[i], min(DATATYPE_BUFF_LEN, strlen(dataType[i]) + 1));
}
g_Dbs.db[0].superTbls[0].columnCount++;
}
diff --git a/src/kit/taosdump/taosdump.c b/src/kit/taosdump/taosdump.c
index e1a213c3565c234323e0f5cfc8e62393f8a47c29..b760c642e5f57baf872148d21dcf29ca85061927 100644
--- a/src/kit/taosdump/taosdump.c
+++ b/src/kit/taosdump/taosdump.c
@@ -13,6 +13,8 @@
* along with this program. If not, see .
*/
+#include
+#include
#include
#include
#include
@@ -26,6 +28,12 @@
#include "tsdb.h"
#include "tutil.h"
+#define AVRO_SUPPORT 0
+
+#if AVRO_SUPPORT == 1
+#include
+#endif
+
#define TSDB_SUPPORT_NANOSECOND 1
#define MAX_FILE_NAME_LEN 256 // max file name length on linux is 255
@@ -128,19 +136,23 @@ enum _describe_table_index {
TSDB_MAX_DESCRIBE_METRIC
};
-#define COL_NOTE_LEN 128
+#define COL_NOTE_LEN 4
+#define COL_TYPEBUF_LEN 16
+#define COL_VALUEBUF_LEN 32
typedef struct {
- char field[TSDB_COL_NAME_LEN + 1];
- char type[16];
+ char field[TSDB_COL_NAME_LEN];
+ char type[COL_TYPEBUF_LEN];
int length;
char note[COL_NOTE_LEN];
-} SColDes;
+ char value[COL_VALUEBUF_LEN];
+ char *var_value;
+} ColDes;
typedef struct {
char name[TSDB_TABLE_NAME_LEN];
- SColDes cols[];
-} STableDef;
+ ColDes cols[];
+} TableDef;
extern char version[];
@@ -334,21 +346,17 @@ static int dumpOut();
static int dumpIn();
static void dumpCreateDbClause(SDbInfo *dbInfo, bool isDumpProperty,
FILE *fp);
-//static int dumpDb(SDbInfo *dbInfo, FILE *fp, TAOS *taos);
-static int dumpStableClasuse(SDbInfo *dbInfo, char *table, FILE *fp);
-static int dumpCreateTableClause(STableDef *tableDes, int numOfCols,
+static int dumpCreateTableClause(TableDef *tableDes, int numOfCols,
FILE *fp, char* dbName);
-static void dumpCreateMTableClause(STableDef *tableDes, char *stable,
- int numOfCols, FILE *fp, char* dbName);
static int getTableDes(
char* dbName, char *table,
- STableDef *stableDes, bool isSuperTable);
+ TableDef *stableDes, bool isSuperTable);
static int64_t dumpTableData(FILE *fp, char *tbName,
char* dbName,
int precision,
char *jsonAvroSchema);
static int checkParam();
-static void taosFreeDbInfos();
+static void freeDbInfos();
struct arguments g_args = {
// connection option
@@ -615,6 +623,17 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
return 0;
}
+static void freeTbDes(TableDef *tableDes)
+{
+ for (int i = 0; i < TSDB_MAX_COLUMNS; i ++) {
+ if (tableDes->cols[i].var_value) {
+ free(tableDes->cols[i].var_value);
+ }
+ }
+
+ free(tableDes);
+}
+
static int queryDbImpl(TAOS *taos, char *command) {
TAOS_RES *res = NULL;
int32_t code = -1;
@@ -694,7 +713,7 @@ static void parse_args(
exit(EXIT_FAILURE);
}
g_args.databases = true;
- } else if (0 == strncmp(argv[i], "--version", strlen("--version")) ||
+ } else if (0 == strncmp(argv[i], "--version", strlen("--version")) ||
0 == strncmp(argv[i], "-V", strlen("-V"))) {
printVersion();
exit(EXIT_SUCCESS);
@@ -773,7 +792,7 @@ static int getPrecisionByString(char *precision)
return -1;
}
-static void taosFreeDbInfos() {
+static void freeDbInfos() {
if (g_dbInfos == NULL) return;
for (int i = 0; i < g_args.dumpDbCount; i++)
tfree(g_dbInfos[i]);
@@ -899,7 +918,6 @@ static int inDatabasesSeq(
dbname = strsep(&running, ",");
}
-
}
return -1;
@@ -965,10 +983,153 @@ static int getDumpDbCount()
return count;
}
-static int convertSchemaToAvroSchema(STableDef *stableDes, char **avroSchema)
+static void dumpCreateMTableClause(
+ char* dbName,
+ char *stable,
+ TableDef *tableDes,
+ int numOfCols,
+ FILE *fp
+ ) {
+ int counter = 0;
+ int count_temp = 0;
+
+ char* tmpBuf = (char *)malloc(COMMAND_SIZE);
+ if (tmpBuf == NULL) {
+ errorPrint("%s() LN%d, failed to allocate %d memory\n",
+ __func__, __LINE__, COMMAND_SIZE);
+ return;
+ }
+
+ char *pstr = NULL;
+ pstr = tmpBuf;
+
+ pstr += sprintf(tmpBuf,
+ "CREATE TABLE IF NOT EXISTS %s.%s USING %s.%s TAGS (",
+ dbName, tableDes->name, dbName, stable);
+
+ for (; counter < numOfCols; counter++) {
+ if (tableDes->cols[counter].note[0] != '\0') break;
+ }
+
+ assert(counter < numOfCols);
+ count_temp = counter;
+
+ for (; counter < numOfCols; counter++) {
+ if (counter != count_temp) {
+ if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 ||
+ strcasecmp(tableDes->cols[counter].type, "nchar") == 0) {
+ //pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].note);
+ if (tableDes->cols[counter].var_value) {
+ pstr += sprintf(pstr, ", %s",
+ tableDes->cols[counter].var_value);
+ } else {
+ pstr += sprintf(pstr, ", %s", tableDes->cols[counter].value);
+ }
+ } else {
+ pstr += sprintf(pstr, ", %s", tableDes->cols[counter].value);
+ }
+ } else {
+ if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 ||
+ strcasecmp(tableDes->cols[counter].type, "nchar") == 0) {
+ //pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].note);
+ if (tableDes->cols[counter].var_value) {
+ pstr += sprintf(pstr, "%s", tableDes->cols[counter].var_value);
+ } else {
+ pstr += sprintf(pstr, "%s", tableDes->cols[counter].value);
+ }
+ } else {
+ pstr += sprintf(pstr, "%s", tableDes->cols[counter].value);
+ }
+ /* pstr += sprintf(pstr, "%s", tableDes->cols[counter].note); */
+ }
+
+ /* if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 || strcasecmp(tableDes->cols[counter].type, "nchar")
+ * == 0) { */
+ /* pstr += sprintf(pstr, "(%d)", tableDes->cols[counter].length); */
+ /* } */
+ }
+
+ pstr += sprintf(pstr, ");");
+
+ fprintf(fp, "%s\n", tmpBuf);
+ free(tmpBuf);
+}
+
+static int convertTbDesToAvroSchema(
+ char *dbName, char *tbName, TableDef *tableDes, int colCount,
+ char **avroSchema)
{
errorPrint("%s() LN%d TODO: covert table schema to avro schema\n",
__func__, __LINE__);
+ // {
+ // "namesapce": "database name",
+ // "type": "record",
+ // "name": "table name",
+ // "fields": [
+ // {
+ // "name": "col0 name",
+ // "type": "long"
+ // },
+ // {
+ // "name": "col1 name",
+ // "type": ["int", "null"]
+ // },
+ // {
+ // "name": "col2 name",
+ // "type": ["float", "null"]
+ // },
+ // ...
+ // {
+ // "name": "coln name",
+ // "type": ["string", "null"]
+ // }
+ // ]
+ // }
+ *avroSchema = (char *)calloc(1,
+ 17 + TSDB_DB_NAME_LEN /* dbname section */
+ + 17 /* type: record */
+ + 11 + TSDB_TABLE_NAME_LEN /* tbname section */
+ + 10 /* fields section */
+ + (TSDB_COL_NAME_LEN + 11 + 16) * colCount + 4); /* fields section */
+ if (*avroSchema == NULL) {
+ errorPrint("%s() LN%d, memory allocation failed!\n", __func__, __LINE__);
+ return -1;
+ }
+
+ char *pstr = *avroSchema;
+ pstr += sprintf(pstr,
+ "{\"namespace\": \"%s\", \"type\": \"record\", \"name\": \"%s\", \"fields\": [",
+ dbName, tbName);
+ for (int i = 0; i < colCount; i ++) {
+ if (0 == i) {
+ pstr += sprintf(pstr,
+ "{\"name\": \"%s\", \"type\": \"%s\"",
+ tableDes->cols[i].field, "long");
+ } else {
+ if (strcasecmp(tableDes->cols[i].type, "binary") == 0 ||
+ strcasecmp(tableDes->cols[i].type, "nchar") == 0) {
+ pstr += sprintf(pstr,
+ "{\"name\": \"%s\", \"type\": [\"%s\", \"null\"]",
+ tableDes->cols[i].field, "string");
+ } else {
+ pstr += sprintf(pstr,
+ "{\"name\": \"%s\", \"type\": [\"%s\", \"null\"]",
+ tableDes->cols[i].field, tableDes->cols[i].type);
+ }
+ }
+ if ((i != (colCount -1))
+ && (strcmp(tableDes->cols[i + 1].note, "TAG") != 0)) {
+ pstr += sprintf(pstr, "},");
+ } else {
+ pstr += sprintf(pstr, "}");
+ break;
+ }
+ }
+
+ pstr += sprintf(pstr, "]}");
+
+ debugPrint("%s() LN%d, avroSchema: %s\n", __func__, __LINE__, *avroSchema);
+
return 0;
}
@@ -981,20 +1142,20 @@ static int64_t dumpNormalTable(
) {
int colCount = 0;
- STableDef *tableDes = (STableDef *)calloc(1, sizeof(STableDef)
- + sizeof(SColDes) * TSDB_MAX_COLUMNS);
+ TableDef *tableDes = (TableDef *)calloc(1, sizeof(TableDef)
+ + sizeof(ColDes) * TSDB_MAX_COLUMNS);
if (stable != NULL && stable[0] != '\0') { // dump table schema which is created by using super table
colCount = getTableDes(dbName, tbName, tableDes, false);
if (colCount < 0) {
- errorPrint("%s", "getTableDes() failed\n");
free(tableDes);
return -1;
}
// create child-table using super-table
- dumpCreateMTableClause(tableDes, stable, colCount, fp, dbName);
+ dumpCreateMTableClause(dbName, stable, tableDes, colCount, fp);
+
} else { // dump table definition
colCount = getTableDes(dbName, tbName, tableDes, false);
@@ -1009,7 +1170,11 @@ static int64_t dumpNormalTable(
char *jsonAvroSchema = NULL;
if (g_args.avro) {
- convertSchemaToAvroSchema(tableDes, &jsonAvroSchema);
+ if (0 != convertTbDesToAvroSchema(
+ dbName, tbName, tableDes, colCount, &jsonAvroSchema)) {
+ freeTbDes(tableDes);
+ return -1;
+ }
}
free(tableDes);
@@ -1370,6 +1535,34 @@ static int64_t dumpNtbOfStbByThreads(
return records;
}
+static int dumpStableClasuse(SDbInfo *dbInfo, char *stbName, FILE *fp)
+{
+ uint64_t sizeOfTableDes =
+ (uint64_t)(sizeof(TableDef) + sizeof(ColDes) * TSDB_MAX_COLUMNS);
+
+ TableDef *tableDes = (TableDef *)calloc(1, sizeOfTableDes);
+ if (NULL == tableDes) {
+ errorPrint("%s() LN%d, failed to allocate %"PRIu64" memory\n",
+ __func__, __LINE__, sizeOfTableDes);
+ exit(-1);
+ }
+
+ int colCount = getTableDes(dbInfo->name,
+ stbName, tableDes, true);
+
+ if (colCount < 0) {
+ free(tableDes);
+ errorPrint("%s() LN%d, failed to get stable[%s] schema\n",
+ __func__, __LINE__, stbName);
+ exit(-1);
+ }
+
+ dumpCreateTableClause(tableDes, colCount, fp, dbInfo->name);
+ free(tableDes);
+
+ return 0;
+}
+
static int64_t dumpCreateSTableClauseOfDb(
SDbInfo *dbInfo, FILE *fp)
{
@@ -1714,7 +1907,7 @@ static int dumpOut() {
/* Close the handle and return */
fclose(fp);
taos_free_result(result);
- taosFreeDbInfos();
+ freeDbInfos();
fprintf(stderr, "dump out rows: %" PRId64 "\n", g_totalDumpOutRows);
return 0;
@@ -1722,14 +1915,14 @@ _exit_failure:
fclose(fp);
taos_close(taos);
taos_free_result(result);
- taosFreeDbInfos();
+ freeDbInfos();
errorPrint("dump out rows: %" PRId64 "\n", g_totalDumpOutRows);
return -1;
}
static int getTableDes(
char* dbName, char *table,
- STableDef *stableDes, bool isSuperTable) {
+ TableDef *tableDes, bool isSuperTable) {
TAOS_ROW row = NULL;
TAOS_RES* res = NULL;
int colCount = 0;
@@ -1758,22 +1951,21 @@ static int getTableDes(
TAOS_FIELD *fields = taos_fetch_fields(res);
- tstrncpy(stableDes->name, table, TSDB_TABLE_NAME_LEN);
+ tstrncpy(tableDes->name, table, TSDB_TABLE_NAME_LEN);
while ((row = taos_fetch_row(res)) != NULL) {
- tstrncpy(stableDes->cols[colCount].field,
+ tstrncpy(tableDes->cols[colCount].field,
(char *)row[TSDB_DESCRIBE_METRIC_FIELD_INDEX],
min(TSDB_COL_NAME_LEN + 1,
fields[TSDB_DESCRIBE_METRIC_FIELD_INDEX].bytes + 1));
- tstrncpy(stableDes->cols[colCount].type,
+ tstrncpy(tableDes->cols[colCount].type,
(char *)row[TSDB_DESCRIBE_METRIC_TYPE_INDEX],
min(16, fields[TSDB_DESCRIBE_METRIC_TYPE_INDEX].bytes + 1));
- stableDes->cols[colCount].length =
+ tableDes->cols[colCount].length =
*((int *)row[TSDB_DESCRIBE_METRIC_LENGTH_INDEX]);
- tstrncpy(stableDes->cols[colCount].note,
+ tstrncpy(tableDes->cols[colCount].note,
(char *)row[TSDB_DESCRIBE_METRIC_NOTE_INDEX],
min(COL_NOTE_LEN,
fields[TSDB_DESCRIBE_METRIC_NOTE_INDEX].bytes + 1));
-
colCount++;
}
@@ -1786,10 +1978,10 @@ static int getTableDes(
// if child-table have tag, using select tagName from table to get tagValue
for (int i = 0 ; i < colCount; i++) {
- if (strcmp(stableDes->cols[i].note, "TAG") != 0) continue;
+ if (strcmp(tableDes->cols[i].note, "TAG") != 0) continue;
sprintf(sqlstr, "select %s from %s.%s",
- stableDes->cols[i].field, dbName, table);
+ tableDes->cols[i].field, dbName, table);
res = taos_query(taos, sqlstr);
code = taos_errno(res);
@@ -1813,7 +2005,7 @@ static int getTableDes(
}
if (row[TSDB_SHOW_TABLES_NAME_INDEX] == NULL) {
- sprintf(stableDes->cols[i].note, "%s", "NULL");
+ sprintf(tableDes->cols[i].note, "%s", "NUL");
taos_free_result(res);
res = NULL;
taos_close(taos);
@@ -1825,58 +2017,82 @@ static int getTableDes(
//int32_t* length = taos_fetch_lengths(tmpResult);
switch (fields[0].type) {
case TSDB_DATA_TYPE_BOOL:
- sprintf(stableDes->cols[i].note, "%d",
+ sprintf(tableDes->cols[i].value, "%d",
((((int32_t)(*((char *)row[TSDB_SHOW_TABLES_NAME_INDEX]))) == 1) ? 1 : 0));
break;
case TSDB_DATA_TYPE_TINYINT:
- sprintf(stableDes->cols[i].note, "%d",
+ sprintf(tableDes->cols[i].value, "%d",
*((int8_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_SMALLINT:
- sprintf(stableDes->cols[i].note, "%d", *((int16_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
+ sprintf(tableDes->cols[i].value, "%d",
+ *((int16_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_INT:
- sprintf(stableDes->cols[i].note, "%d", *((int32_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
+ sprintf(tableDes->cols[i].value, "%d",
+ *((int32_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_BIGINT:
- sprintf(stableDes->cols[i].note, "%" PRId64 "", *((int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
+ sprintf(tableDes->cols[i].value, "%" PRId64 "",
+ *((int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_FLOAT:
- sprintf(stableDes->cols[i].note, "%f", GET_FLOAT_VAL(row[TSDB_SHOW_TABLES_NAME_INDEX]));
+ sprintf(tableDes->cols[i].value, "%f",
+ GET_FLOAT_VAL(row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_DOUBLE:
- sprintf(stableDes->cols[i].note, "%f", GET_DOUBLE_VAL(row[TSDB_SHOW_TABLES_NAME_INDEX]));
+ sprintf(tableDes->cols[i].value, "%f",
+ GET_DOUBLE_VAL(row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_BINARY:
- {
- memset(stableDes->cols[i].note, 0, sizeof(stableDes->cols[i].note));
- stableDes->cols[i].note[0] = '\'';
- char tbuf[COL_NOTE_LEN];
- converStringToReadable((char *)row[TSDB_SHOW_TABLES_NAME_INDEX], length[0], tbuf, COL_NOTE_LEN);
- char* pstr = stpcpy(&(stableDes->cols[i].note[1]), tbuf);
- *(pstr++) = '\'';
- break;
+ memset(tableDes->cols[i].value, 0,
+ sizeof(tableDes->cols[i].value));
+ int len = strlen((char *)row[0]);
+ // FIXME for long value
+ if (len < (COL_VALUEBUF_LEN - 2)) {
+ tableDes->cols[i].value[0] = '\'';
+ converStringToReadable(
+ (char *)row[0],
+ length[0],
+ tableDes->cols[i].value + 1,
+ len);
+ tableDes->cols[i].value[len+1] = '\'';
+ } else {
+ tableDes->cols[i].var_value = calloc(1, len + 2);
+ if (tableDes->cols[i].var_value == NULL) {
+ errorPrint("%s() LN%d, memory alalocation failed!\n",
+ __func__, __LINE__);
+ taos_free_result(res);
+ return -1;
+ }
+ tableDes->cols[i].var_value[0] = '\'';
+ converStringToReadable((char *)row[0],
+ length[0],
+ (char *)(tableDes->cols[i].var_value + 1), len);
+ tableDes->cols[i].var_value[len+1] = '\'';
}
+ break;
+
case TSDB_DATA_TYPE_NCHAR:
{
- memset(stableDes->cols[i].note, 0, sizeof(stableDes->cols[i].note));
+ memset(tableDes->cols[i].value, 0, sizeof(tableDes->cols[i].note));
char tbuf[COL_NOTE_LEN-2]; // need reserve 2 bytes for ' '
convertNCharToReadable((char *)row[TSDB_SHOW_TABLES_NAME_INDEX], length[0], tbuf, COL_NOTE_LEN);
- sprintf(stableDes->cols[i].note, "\'%s\'", tbuf);
+ sprintf(tableDes->cols[i].value, "\'%s\'", tbuf);
break;
}
case TSDB_DATA_TYPE_TIMESTAMP:
- sprintf(stableDes->cols[i].note, "%" PRId64 "", *(int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
+ sprintf(tableDes->cols[i].value, "%" PRId64 "", *(int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
#if 0
if (!g_args.mysqlFlag) {
- sprintf(tableDes->cols[i].note, "%" PRId64 "", *(int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
+ sprintf(tableDes->cols[i].value, "%" PRId64 "", *(int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
} else {
char buf[64] = "\0";
int64_t ts = *((int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
time_t tt = (time_t)(ts / 1000);
struct tm *ptm = localtime(&tt);
strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
- sprintf(tableDes->cols[i].note, "\'%s.%03d\'", buf, (int)(ts % 1000));
+ sprintf(tableDes->cols[i].value, "\'%s.%03d\'", buf, (int)(ts % 1000));
}
#endif
break;
@@ -1913,35 +2129,7 @@ static void dumpCreateDbClause(
fprintf(fp, "%s\n\n", sqlstr);
}
-static int dumpStableClasuse(SDbInfo *dbInfo, char *stbName, FILE *fp)
-{
- uint64_t sizeOfTableDes =
- (uint64_t)(sizeof(STableDef) + sizeof(SColDes) * TSDB_MAX_COLUMNS);
-
- STableDef *stableDes = (STableDef *)calloc(1, sizeOfTableDes);
- if (NULL == stableDes) {
- errorPrint("%s() LN%d, failed to allocate %"PRIu64" memory\n",
- __func__, __LINE__, sizeOfTableDes);
- exit(-1);
- }
-
- int colCount = getTableDes(dbInfo->name,
- stbName, stableDes, true);
-
- if (colCount < 0) {
- free(stableDes);
- errorPrint("%s() LN%d, failed to get stable[%s] schema\n",
- __func__, __LINE__, stbName);
- exit(-1);
- }
-
- dumpCreateTableClause(stableDes, colCount, fp, dbInfo->name);
- free(stableDes);
-
- return 0;
-}
-
-static int dumpCreateTableClause(STableDef *tableDes, int numOfCols,
+static int dumpCreateTableClause(TableDef *tableDes, int numOfCols,
FILE *fp, char* dbName) {
int counter = 0;
int count_temp = 0;
@@ -1992,64 +2180,6 @@ static int dumpCreateTableClause(STableDef *tableDes, int numOfCols,
return fprintf(fp, "%s\n\n", sqlstr);
}
-static void dumpCreateMTableClause(STableDef *tableDes, char *stable,
- int numOfCols, FILE *fp, char* dbName) {
- int counter = 0;
- int count_temp = 0;
-
- char* tmpBuf = (char *)malloc(COMMAND_SIZE);
- if (tmpBuf == NULL) {
- errorPrint("%s() LN%d, failed to allocate %d memory\n",
- __func__, __LINE__, COMMAND_SIZE);
- return;
- }
-
- char *pstr = NULL;
- pstr = tmpBuf;
-
- pstr += sprintf(tmpBuf,
- "CREATE TABLE IF NOT EXISTS %s.%s USING %s.%s TAGS (",
- dbName, tableDes->name, dbName, stable);
-
- for (; counter < numOfCols; counter++) {
- if (tableDes->cols[counter].note[0] != '\0') break;
- }
-
- assert(counter < numOfCols);
- count_temp = counter;
-
- for (; counter < numOfCols; counter++) {
- if (counter != count_temp) {
- if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 ||
- strcasecmp(tableDes->cols[counter].type, "nchar") == 0) {
- //pstr += sprintf(pstr, ", \'%s\'", tableDes->cols[counter].note);
- pstr += sprintf(pstr, ", %s", tableDes->cols[counter].note);
- } else {
- pstr += sprintf(pstr, ", %s", tableDes->cols[counter].note);
- }
- } else {
- if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 ||
- strcasecmp(tableDes->cols[counter].type, "nchar") == 0) {
- //pstr += sprintf(pstr, "\'%s\'", tableDes->cols[counter].note);
- pstr += sprintf(pstr, "%s", tableDes->cols[counter].note);
- } else {
- pstr += sprintf(pstr, "%s", tableDes->cols[counter].note);
- }
- /* pstr += sprintf(pstr, "%s", tableDes->cols[counter].note); */
- }
-
- /* if (strcasecmp(tableDes->cols[counter].type, "binary") == 0 || strcasecmp(tableDes->cols[counter].type, "nchar")
- * == 0) { */
- /* pstr += sprintf(pstr, "(%d)", tableDes->cols[counter].length); */
- /* } */
- }
-
- pstr += sprintf(pstr, ");");
-
- fprintf(fp, "%s\n", tmpBuf);
- free(tmpBuf);
-}
-
static int writeSchemaToAvro(char *jsonAvroSchema)
{
errorPrint("%s() LN%d, TODO: implement write schema to avro",
@@ -2146,10 +2276,7 @@ static int64_t writeResultToSql(TAOS_RES *res, FILE *fp, char *dbName, char *tbN
case TSDB_DATA_TYPE_BINARY:
{
char tbuf[COMMAND_SIZE] = {0};
- //*(pstr++) = '\'';
converStringToReadable((char *)row[col], length[col], tbuf, COMMAND_SIZE);
- //pstr = stpcpy(pstr, tbuf);
- //*(pstr++) = '\'';
curr_sqlstr_len += sprintf(pstr + curr_sqlstr_len, "\'%s\'", tbuf);
break;
}
@@ -2405,7 +2532,6 @@ static int converStringToReadable(char *str, int size, char *buf, int bufsize) {
static int convertNCharToReadable(char *str, int size, char *buf, int bufsize) {
char *pstr = str;
char *pbuf = buf;
- // TODO
wchar_t wc;
while (size > 0) {
if (*pstr == '\0') break;
diff --git a/tests/connectorTest/C#Test/nanosupport/nanotest.cs b/tests/connectorTest/C#Test/nanosupport/nanotest.cs
index b9eaefef8c740f8196a715282c8c28ffd79bbdac..666c731e3a88feb727ff9ea0f84111ae36bd211e 100644
--- a/tests/connectorTest/C#Test/nanosupport/nanotest.cs
+++ b/tests/connectorTest/C#Test/nanosupport/nanotest.cs
@@ -29,21 +29,7 @@ namespace TDengineDriver
private string password="taosdata";
private short port = 0;
- //sql parameters
- private string dbName;
- private string tbName;
- private string precision;
-
- private bool isInsertData;
- private bool isQueryData;
-
- private long tableCount;
- private long totalRows;
- private long batchRows;
- private long beginTimestamp = 1551369600000L;
-
private IntPtr conn = IntPtr.Zero;
- private long rowsInserted = 0;
static void Main(string[] args)
{
@@ -73,15 +59,6 @@ namespace TDengineDriver
tester.executeQuery("select * from tb;");
- // Console.WriteLine("expected is : {0}", width);
- // tdSql.checkData(0,0,"2021-06-10 0:00:00.100000001");
- // tdSql.checkData(1,0,"2021-06-10 0:00:00.150000000");
- // tdSql.checkData(2,0,"2021-06-10 0:00:00.299999999");
- // tdSql.checkData(3,1,3);
- // tdSql.checkData(4,1,5);
- // tdSql.checkData(5,1,7);
- // tdSql.checkRows(6);
-
tester.executeQuery("select count(*) from tb where ts > 1623254400100000000 and ts < 1623254400100000002;");
Console.WriteLine("expected is : 1 " );
tester.executeQuery("select count(*) from tb where ts > '2021-06-10 0:00:00.100000001' and ts < '2021-06-10 0:00:00.160000000';");
@@ -271,8 +248,8 @@ namespace TDengineDriver
// tdSql.checkData(0,0,1623258000123456789);
-
Console.WriteLine("usdb" );
+ tester.execute("drop database if exists usdb;");
tester.execute("create database usdb precision 'us';");
tester.execute("use usdb;");
tester.execute("create stable st (ts timestamp ,speed float ) tags(time timestamp ,id int);");
@@ -289,16 +266,12 @@ namespace TDengineDriver
tester.execute("insert into tb1 using st tags('2021-06-10 0:00:00.123' , 1 ) values('2021-06-10T0:00:00.123+07:00' , 1.0);" );
tester.executeQuery("select first(*) from tb1;");
Console.WriteLine("expected is : 1623258000123 " );
-
-
-
+
tester.CloseConnection();
tester.cleanup();
-
-
}
- public void InitTDengine()
+ public void InitTDengine()
{
TDengine.Options((int)TDengineInitOption.TDDB_OPTION_CONFIGDIR, this.configDir);
TDengine.Options((int)TDengineInitOption.TDDB_OPTION_SHELL_ACTIVITY_TIMER, "60");
@@ -307,7 +280,7 @@ namespace TDengineDriver
Console.WriteLine("get connection starting...");
}
- public void ConnectTDengine()
+ public void ConnectTDengine()
{
string db = "";
this.conn = TDengine.Connect(this.host, this.user, this.password, db, this.port);
@@ -321,13 +294,13 @@ namespace TDengineDriver
Console.WriteLine("[ OK ] Connection established.");
}
}
- //EXECUTE SQL
- public void execute(string sql)
+
+ //EXECUTE SQL
+ public void execute(string sql)
{
DateTime dt1 = DateTime.Now;
IntPtr res = TDengine.Query(this.conn, sql.ToString());
DateTime dt2 = DateTime.Now;
- TimeSpan span = dt2 - dt1;
if ((res == IntPtr.Zero) || (TDengine.ErrorNo(res) != 0))
{
@@ -345,7 +318,7 @@ namespace TDengineDriver
TDengine.FreeResult(res);
}
//EXECUTE QUERY
- public void executeQuery(string sql)
+ public void executeQuery(string sql)
{
DateTime dt1 = DateTime.Now;
@@ -454,7 +427,7 @@ namespace TDengineDriver
}
- public void CloseConnection()
+ public void CloseConnection()
{
if (this.conn != IntPtr.Zero)
{
@@ -481,22 +454,16 @@ namespace TDengineDriver
switch(psc)
{
case 0:
- Console.WriteLine("db:[{0:G}]'s precision is {1:G}",this.dbName,"millisecond");
+ Console.WriteLine("db:[{0:G}]'s precision is {1:G} millisecond");
break;
case 1:
- Console.WriteLine("db:[{0:G}]'s precision is {1:G}",this.dbName,"microsecond");
+ Console.WriteLine("db:[{0:G}]'s precision is {1:G} microsecond");
break;
case 2:
- Console.WriteLine("db:[{0:G}]'s precision is {1:G}",this.dbName,"nanosecond");
+ Console.WriteLine("db:[{0:G}]'s precision is {1:G} nanosecond");
break;
}
-
- }
-
- // public void checkData(int x ,int y , long ts ){
-
- // }
-
+ }
}
}
diff --git a/tests/pytest/client/nettest.py b/tests/pytest/client/nettest.py
new file mode 100644
index 0000000000000000000000000000000000000000..50bc5cd01489c35eead69537dac64af38ad365cf
--- /dev/null
+++ b/tests/pytest/client/nettest.py
@@ -0,0 +1,57 @@
+###################################################################
+# 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 taos
+import subprocess
+
+from util.log import tdLog
+from util.cases import tdCases
+from util.sql import tdSql
+
+class TDTestCase:
+ def init(self, conn, logSql):
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor(), logSql)
+
+ def run(self):
+ try:
+ str1 = 'taos -n speed -P 6030 -N 1000 -l 100000 -S tcp'
+ result1 = subprocess.call(str1)
+ except Exception as result1:
+ if result1 == 1:
+ tdLog.exit("the shell 'taos -n speed -P 6030 -N 1000 -l 100000 -S tcp' is wrong")
+
+ try:
+ str2 = 'taos -n speed -P 6030 -N 1000 -l 100000 -S udp'
+ result2 = subprocess.call(str2)
+ except Exception as result2:
+ if result2 == 1:
+ tdLog.exit("the shell 'taos -n speed -P 6030 -N 1000 -l 100000 -S udp' is wrong")
+
+ try:
+ str3 = 'taos -n fqdn'
+ result3 = subprocess.call(str3)
+ except Exception as result3:
+ if result3 ==1:
+ tdLog.exit('the shell"taos -n fqdn" is wrong')
+
+
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+
+
+tdCases.addWindows(__file__, TDTestCase())
+tdCases.addLinux(__file__, TDTestCase())
diff --git a/tests/pytest/fulltest.sh b/tests/pytest/fulltest.sh
index a7c375489aec74517f9bb92938b4179b6f9e5dc0..32551042a69f63a5fbf9eb84e26a1c4a8c6ce4b7 100755
--- a/tests/pytest/fulltest.sh
+++ b/tests/pytest/fulltest.sh
@@ -398,7 +398,12 @@ python3 ./test.py -f query/queryWildcardLength.py
python3 ./test.py -f query/queryTbnameUpperLower.py
python3 ./test.py -f query/query.py
python3 ./test.py -f query/queryDiffColsOr.py
+
+
+python3 ./test.py -f client/nettest.py
+
python3 ./test.py -f query/queryRegex.py
+
#======================p4-end===============
diff --git a/tests/pytest/insert/schemaChangeTest.py b/tests/pytest/insert/schemaChangeTest.py
new file mode 100644
index 0000000000000000000000000000000000000000..a62a15bcc0f05bf0229d12698b01c7917f6b9d95
--- /dev/null
+++ b/tests/pytest/insert/schemaChangeTest.py
@@ -0,0 +1,72 @@
+###################################################################
+# Copyright (c) 2016 by TAOS Technologies, Inc.
+# All rights reserved.
+#
+# This file is proprietary and confidential to TAOS Technologies.
+# No part of this file may be reproduced, stored, transmitted,
+# disclosed or used in any form or by any means other than as
+# expressly provided by the written permission from Jianhui Tao
+#
+###################################################################
+
+# -*- coding: utf-8 -*-
+
+import sys
+import taos
+from util.log import *
+from util.cases import *
+from util.sql import *
+from util.dnodes import *
+import multiprocessing as mp
+
+class TDTestCase:
+ def init(self, conn, logSql):
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor())
+ self.ts = 1609430400000
+
+ def alterTableSchema(self):
+ conn1 = taos.connect(host="127.0.0.1", user="root", password="taosdata", config=tdDnodes.getSimCfgPath())
+ c1 = conn1.cursor()
+
+ c1.execute("use db")
+ c1.execute("alter table st drop column c2")
+ c1.execute("alter table st add column c2 double")
+
+ tdLog.sleep(1)
+ c1.execute("select * from st")
+ for data in c1:
+ print("Process 1: c2 = %s" % data[2])
+
+
+ def insertData(self):
+ conn2 = taos.connect(host="127.0.0.1", user="root", password="taosdata", config=tdDnodes.getSimCfgPath())
+ c2 = conn2.cursor()
+
+ tdLog.sleep(1)
+ c2.execute("use db")
+ c2.execute("insert into t1 values(%d, 2, 2.22)" % (self.ts + 1))
+
+ c2.execute("select * from st")
+ for data in c2:
+ print("Process 2: c2 = %f" % data[2])
+
+ def run(self):
+ tdSql.prepare()
+ tdSql.execute("create table st(ts timestamp, c1 int, c2 float) tags(t1 int)")
+ tdSql.execute("create table t1 using st tags(1)")
+ tdSql.execute("insert into t1 values(%d, 1, 1.11)" % self.ts)
+ p1 = mp.Process(target=self.alterTableSchema, args=())
+ p2 = mp.Process(target=self.insertData, args=())
+ p1.start()
+ p2.start()
+
+ p1.join()
+ p2.join()
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+tdCases.addWindows(__file__, TDTestCase())
+tdCases.addLinux(__file__, TDTestCase())
\ No newline at end of file