diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6809386c..be1d1099 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -38,7 +38,7 @@ jobs: libgeos-dev libjansson-dev libsnappy-dev liblzma-dev libz-dev \ zlib1g pkg-config libssl-dev gawk - - name: install TDengine + - name: Install TDengine run: | cd TDengine mkdir debug @@ -49,11 +49,11 @@ jobs: which taosd which taosadapter - - name: start taosd + - name: Start taosd run: | nohup sudo taosd & - - name: start taosadapter + - name: Start taosadapter run: | nohup sudo taosadapter & @@ -69,7 +69,7 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: test nodejs websocket + - name: Test nodejs websocket working-directory: nodejs-connector/nodejs run: | export TDENGINE_CLOUD_URL=${{ secrets.TDENGINE_CLOUD_URL }} diff --git a/nodejs/example/all_type_query.ts b/nodejs/example/all_type_query.ts index 31c90150..9c2b3caf 100644 --- a/nodejs/example/all_type_query.ts +++ b/nodejs/example/all_type_query.ts @@ -1,5 +1,5 @@ import { WSConfig } from "../src/common/config"; -import { sqlConnect, destroy, setLogLevel } from "../src"; +import { sqlConnect, destroy } from "../src"; let dsn = "ws://127.0.0.1:6041"; async function json_tag_example() { @@ -29,8 +29,8 @@ async function json_tag_example() { let taosResult = await wsSql.exec(insertQuery); console.log( "Successfully inserted " + - taosResult.getAffectRows() + - " rows to example_json_tag.stb." + taosResult.getAffectRows() + + " rows to example_json_tag.stb." ); let sql = "SELECT ts, v, jt FROM example_json_tag.stb limit 100"; @@ -70,10 +70,10 @@ async function all_type_example() { // create table await wsSql.exec( "create table if not exists all_type_example.stb (ts timestamp, " + - "int_col INT, double_col DOUBLE, bool_col BOOL, binary_col BINARY(100)," + - "nchar_col NCHAR(100), varbinary_col VARBINARY(100), geometry_col GEOMETRY(100)) " + - "tags(int_tag INT, double_tag DOUBLE, bool_tag BOOL, binary_tag BINARY(100)," + - "nchar_tag NCHAR(100), varbinary_tag VARBINARY(100), geometry_tag GEOMETRY(100));" + "int_col INT, double_col DOUBLE, bool_col BOOL, binary_col BINARY(100)," + + "nchar_col NCHAR(100), varbinary_col VARBINARY(100), geometry_col GEOMETRY(100)) " + + "tags(int_tag INT, double_tag DOUBLE, bool_tag BOOL, binary_tag BINARY(100)," + + "nchar_tag NCHAR(100), varbinary_tag VARBINARY(100), geometry_tag GEOMETRY(100));" ); console.log("Create stable all_type_example.stb successfully"); @@ -85,8 +85,8 @@ async function all_type_example() { let taosResult = await wsSql.exec(insertQuery); console.log( "Successfully inserted " + - taosResult.getAffectRows() + - " rows to all_type_example.stb." + taosResult.getAffectRows() + + " rows to all_type_example.stb." ); let sql = "SELECT * FROM all_type_example.stb limit 100"; diff --git a/nodejs/example/all_type_stmt.ts b/nodejs/example/all_type_stmt.ts index f15d1b1e..9799ff09 100644 --- a/nodejs/example/all_type_stmt.ts +++ b/nodejs/example/all_type_stmt.ts @@ -80,10 +80,10 @@ async function all_type_example() { // create table await wsSql.exec( "create table if not exists stb (ts timestamp, " + - "int_col INT, double_col DOUBLE, bool_col BOOL, binary_col BINARY(100)," + - "nchar_col NCHAR(100), varbinary_col VARBINARY(100), geometry_col GEOMETRY(100)) " + - "tags(int_tag INT, double_tag DOUBLE, bool_tag BOOL, binary_tag BINARY(100)," + - "nchar_tag NCHAR(100), varbinary_tag VARBINARY(100), geometry_tag GEOMETRY(100));" + "int_col INT, double_col DOUBLE, bool_col BOOL, binary_col BINARY(100)," + + "nchar_col NCHAR(100), varbinary_col VARBINARY(100), geometry_col GEOMETRY(100)) " + + "tags(int_tag INT, double_tag DOUBLE, bool_tag BOOL, binary_tag BINARY(100)," + + "nchar_tag NCHAR(100), varbinary_tag VARBINARY(100), geometry_tag GEOMETRY(100));" ); console.log("Create stable all_type_example.stb successfully"); diff --git a/nodejs/example/basicBatchTmq.ts b/nodejs/example/basicBatchTmq.ts index 0a3b5a69..daf8b714 100644 --- a/nodejs/example/basicBatchTmq.ts +++ b/nodejs/example/basicBatchTmq.ts @@ -62,8 +62,7 @@ async function insert() { let wsSql = await sqlConnect(conf); for (let i = 0; i < 10000; i++) { await wsSql.exec( - `INSERT INTO d1001 USING ${stable} (location, groupId) TAGS ("California.SanFrancisco", 3) VALUES (NOW + ${i}a, ${ - 10 + i + `INSERT INTO d1001 USING ${stable} (location, groupId) TAGS ("California.SanFrancisco", 3) VALUES (NOW + ${i}a, ${10 + i }, ${200 + i}, ${0.32 + i})` ); } diff --git a/nodejs/example/basicTmq.ts b/nodejs/example/basicTmq.ts index fd8f55cc..683970da 100644 --- a/nodejs/example/basicTmq.ts +++ b/nodejs/example/basicTmq.ts @@ -5,7 +5,6 @@ import { destroy, setLogLevel, sqlConnect, tmqConnect } from "../src"; const stable = "meters"; const db = "power"; const topics: string[] = ["topic_ws_map"]; -let dropTopic = `DROP TOPIC IF EXISTS ${topics[0]};`; let configMap = new Map([ [TMQConstants.GROUP_ID, "gId_11"], [TMQConstants.CONNECT_USER, "root"], @@ -31,8 +30,7 @@ async function Prepare() { await ws.exec(createTopic); for (let i = 0; i < 1000; i++) { await ws.exec( - `INSERT INTO d1001 USING ${stable} (location, groupId) TAGS ("California.SanFrancisco", 3) VALUES (NOW + ${i}a, ${ - 10 + i + `INSERT INTO d1001 USING ${stable} (location, groupId) TAGS ("California.SanFrancisco", 3) VALUES (NOW + ${i}a, ${10 + i }, ${200 + i}, ${0.32 + i})` ); } diff --git a/nodejs/src/client/wsClient.ts b/nodejs/src/client/wsClient.ts index 9fb3e1c6..ed4a32f8 100644 --- a/nodejs/src/client/wsClient.ts +++ b/nodejs/src/client/wsClient.ts @@ -347,7 +347,6 @@ export class WsClient { this._wsConnector ); this._wsConnector = undefined; - // this._wsConnector.close(); } } diff --git a/nodejs/src/client/wsConnector.ts b/nodejs/src/client/wsConnector.ts index f77fd250..61e88160 100644 --- a/nodejs/src/client/wsConnector.ts +++ b/nodejs/src/client/wsConnector.ts @@ -210,9 +210,9 @@ export class WebSocketConnector { } logger.debug( "[wsClient.sendBinaryMsg()]===>" + - reqId + - action + - message.byteLength + reqId + + action + + message.byteLength ); this._wsConn.send(message); } else { diff --git a/nodejs/src/client/wsConnectorPool.ts b/nodejs/src/client/wsConnectorPool.ts index b1707e00..ab8d13e5 100644 --- a/nodejs/src/client/wsConnectorPool.ts +++ b/nodejs/src/client/wsConnectorPool.ts @@ -67,7 +67,7 @@ export class WebSocketConnectionPool { if (connector) { logger.debug( "get connection success:" + - Atomics.load(WebSocketConnectionPool.sharedArray, 0) + Atomics.load(WebSocketConnectionPool.sharedArray, 0) ); return connector; } @@ -75,20 +75,20 @@ export class WebSocketConnectionPool { if ( this._maxConnections != -1 && Atomics.load(WebSocketConnectionPool.sharedArray, 0) > - this._maxConnections + this._maxConnections ) { throw new TDWebSocketClientError( ErrorCode.ERR_WEBSOCKET_CONNECTION_ARRIVED_LIMIT, "websocket connect arrived limited:" + - Atomics.load(WebSocketConnectionPool.sharedArray, 0) + Atomics.load(WebSocketConnectionPool.sharedArray, 0) ); } Atomics.add(WebSocketConnectionPool.sharedArray, 0, 1); logger.info( "getConnection, new connection count:" + - Atomics.load(WebSocketConnectionPool.sharedArray, 0) + - ", connectAddr:" + - connectAddr + Atomics.load(WebSocketConnectionPool.sharedArray, 0) + + ", connectAddr:" + + connectAddr ); return new WebSocketConnector(url, timeout); } finally { @@ -115,14 +115,14 @@ export class WebSocketConnectionPool { } logger.info( "releaseConnection, current connection count:" + - connectors.length + connectors.length ); } else { Atomics.add(WebSocketConnectionPool.sharedArray, 0, -1); connector.close(); logger.info( "releaseConnection, current connection status fail:" + - Atomics.load(WebSocketConnectionPool.sharedArray, 0) + Atomics.load(WebSocketConnectionPool.sharedArray, 0) ); } } finally { @@ -143,9 +143,9 @@ export class WebSocketConnectionPool { } logger.info( "destroyed connect:" + - Atomics.load(WebSocketConnectionPool.sharedArray, 0) + - " current count:" + - num + Atomics.load(WebSocketConnectionPool.sharedArray, 0) + + " current count:" + + num ); Atomics.store(WebSocketConnectionPool.sharedArray, 0, 0); this.pool = new Map(); diff --git a/nodejs/src/client/wsEventCallback.ts b/nodejs/src/client/wsEventCallback.ts index 3b78dc17..860513e6 100644 --- a/nodejs/src/client/wsEventCallback.ts +++ b/nodejs/src/client/wsEventCallback.ts @@ -33,7 +33,7 @@ export class WsEventCallback { private static _instance?: WsEventCallback; private static _msgActionRegister: Map = new Map(); - private constructor() {} + private constructor() { } public static instance(): WsEventCallback { if (!WsEventCallback._instance) { @@ -124,9 +124,9 @@ export class WsEventCallback { throw new TDWebSocketClientError( ErrorCode.ERR_WS_NO_CALLBACK, "no callback registered for fetch_block with req_id=" + - msg.req_id + - " action" + - msg.action + msg.req_id + + " action" + + msg.action ); } } diff --git a/nodejs/src/common/config.ts b/nodejs/src/common/config.ts index 766fa52b..445a9582 100644 --- a/nodejs/src/common/config.ts +++ b/nodejs/src/common/config.ts @@ -22,6 +22,7 @@ export class WSConfig { public getToken(): string | undefined | null { return this._token; } + public setToken(token: string) { this._token = token; } @@ -29,6 +30,7 @@ export class WSConfig { public getUser(): string | undefined | null { return this._user; } + public setUser(user: string) { this._user = user; } @@ -36,6 +38,7 @@ export class WSConfig { public getPwd(): string | undefined | null { return this._password; } + public setPwd(pws: string) { this._password = pws; } @@ -43,6 +46,7 @@ export class WSConfig { public getDb(): string | undefined | null { return this._db; } + public setDb(db: string) { this._db = db; } @@ -55,18 +59,22 @@ export class WSConfig { this._url = url; } - public setTimeOut(ms: number) { - this._timeout = ms; - } public getTimeOut(): number | undefined | null { return this._timeout; } - public setTimezone(timezone: string) { - this._timezone = timezone; + + public setTimeOut(ms: number) { + this._timeout = ms; } + public getTimezone(): string | undefined | null { return this._timezone; } + + public setTimezone(timezone: string) { + this._timezone = timezone; + } + public getMinStmt2Version() { return this._minStmt2Version; } diff --git a/nodejs/src/common/constant.ts b/nodejs/src/common/constant.ts index d17b8e70..4bc8cb56 100644 --- a/nodejs/src/common/constant.ts +++ b/nodejs/src/common/constant.ts @@ -67,9 +67,9 @@ export enum TDengineTypeCode { } export enum TSDB_OPTION_CONNECTION { - TSDB_OPTION_CONNECTION_CHARSET, // charset, Same as the scope supported by the system + TSDB_OPTION_CONNECTION_CHARSET, // charset, Same as the scope supported by the system TSDB_OPTION_CONNECTION_TIMEZONE, // timezone, Same as the scope supported by the system - TSDB_OPTION_CONNECTION_USER_IP, // user ip + TSDB_OPTION_CONNECTION_USER_IP, // user ip TSDB_OPTION_CONNECTION_USER_APP, // user app } diff --git a/nodejs/src/common/taosResult.ts b/nodejs/src/common/taosResult.ts index 388b5927..117892d4 100644 --- a/nodejs/src/common/taosResult.ts +++ b/nodejs/src/common/taosResult.ts @@ -123,9 +123,11 @@ export class TaosResult { public getData(): Array> | null { return this._data; } + public setData(value: Array> | null) { this._data = value; } + public getAffectRows(): number | null | undefined { return this._affectRows; } @@ -137,9 +139,11 @@ export class TaosResult { public getPrecision(): number | null | undefined { return this._precision; } + public getTotalTime() { return this._totalTime; } + public addTotalTime(totalTime: number) { this._totalTime += totalTime; } diff --git a/nodejs/src/common/wsError.ts b/nodejs/src/common/wsError.ts index 56fe15a1..b1ed3ee9 100644 --- a/nodejs/src/common/wsError.ts +++ b/nodejs/src/common/wsError.ts @@ -14,11 +14,11 @@ export class TDWebSocketClientError extends Error { } } } -export class WebSocketQueryError extends TDWebSocketClientError {} -export class WebSocketInterfaceError extends TDWebSocketClientError {} -export class WebSocketQueryInterFaceError extends WebSocketInterfaceError {} -export class TaosResultError extends TDWebSocketClientError {} -export class TaosError extends TDWebSocketClientError {} +export class WebSocketQueryError extends TDWebSocketClientError { } +export class WebSocketInterfaceError extends TDWebSocketClientError { } +export class WebSocketQueryInterFaceError extends WebSocketInterfaceError { } +export class TaosResultError extends TDWebSocketClientError { } +export class TaosError extends TDWebSocketClientError { } export enum ErrorCode { ERR_INVALID_PARAMS = 100, diff --git a/nodejs/src/index.ts b/nodejs/src/index.ts index 62cd82fe..8759924a 100644 --- a/nodejs/src/index.ts +++ b/nodejs/src/index.ts @@ -2,7 +2,6 @@ import { WsSql } from "./sql/wsSql"; import { WSConfig } from "./common/config"; import { WsConsumer } from "./tmq/wsTmq"; import logger, { setLevel } from "./common/log"; - import { WebSocketConnectionPool } from "./client/wsConnectorPool"; let sqlConnect = async (conf: WSConfig) => { diff --git a/nodejs/src/sql/wsRows.ts b/nodejs/src/sql/wsRows.ts index a3dd260d..04f4ee0c 100644 --- a/nodejs/src/sql/wsRows.ts +++ b/nodejs/src/sql/wsRows.ts @@ -5,7 +5,7 @@ import { WsClient } from "../client/wsClient"; import logger from "../common/log"; import { ReqId } from "../common/reqid"; import { getBinarySql } from "../common/utils"; -import { BinaryQueryMessage, FetchRawBlockMessage } from "../common/constant"; +import { FetchRawBlockMessage } from "../common/constant"; export class WSRows { private _wsClient: WsClient; @@ -107,7 +107,7 @@ export class WSRows { let data = this._taosResult.getData(); if (this._taosResult && data != null) { if (Array.isArray(data) && data.length > 0) { - return data.pop(); + return data.shift(); } } return undefined; diff --git a/nodejs/src/sql/wsSql.ts b/nodejs/src/sql/wsSql.ts index 4354596e..d0d80665 100644 --- a/nodejs/src/sql/wsSql.ts +++ b/nodejs/src/sql/wsSql.ts @@ -15,7 +15,6 @@ import { ReqId } from "../common/reqid"; import { BinaryQueryMessage, FetchRawBlockMessage, - MinStmt2Version, PrecisionLength, TSDB_OPTION_CONNECTION, } from "../common/constant"; @@ -27,10 +26,11 @@ import { WsStmt2 } from "../stmt/wsStmt2"; export class WsSql { private wsConfig: WSConfig; private _wsClient: WsClient; + constructor(wsConfig: WSConfig) { let url = getUrl(wsConfig); - this._wsClient = new WsClient(url, wsConfig.getTimeOut()); this.wsConfig = wsConfig; + this._wsClient = new WsClient(url, wsConfig.getTimeOut()); } static async open(wsConfig: WSConfig): Promise { diff --git a/nodejs/src/stmt/wsParams1.ts b/nodejs/src/stmt/wsParams1.ts index 6aa4c4f1..46703669 100644 --- a/nodejs/src/stmt/wsParams1.ts +++ b/nodejs/src/stmt/wsParams1.ts @@ -66,7 +66,7 @@ export class Stmt1BindParams extends StmtBindParams implements IDataEncoder { //Computing the length of data let arrayBuffer = new ArrayBuffer( bitMapLen + - TDengineTypeLength[TDengineTypeCode.TIMESTAMP] * params.length + TDengineTypeLength[TDengineTypeCode.TIMESTAMP] * params.length ); //bitmap get data range let bitmapBuffer = new DataView(arrayBuffer); @@ -121,7 +121,7 @@ export class Stmt1BindParams extends StmtBindParams implements IDataEncoder { throw new TaosError( ErrorCode.ERR_INVALID_PARAMS, "SeTimestampColumn params precisionLength is invalid! param:=" + - params[i] + params[i] ); } } else if (this.precisionLength == digit) { @@ -130,7 +130,7 @@ export class Stmt1BindParams extends StmtBindParams implements IDataEncoder { throw new TaosError( ErrorCode.ERR_INVALID_PARAMS, "SeTimestampColumn params is invalid! param:=" + - params[i] + params[i] ); } } @@ -147,7 +147,7 @@ export class Stmt1BindParams extends StmtBindParams implements IDataEncoder { new ColumnInfo( [ TDengineTypeLength[TDengineTypeCode.TIMESTAMP] * - params.length, + params.length, arrayBuffer, ], TDengineTypeCode.TIMESTAMP, @@ -254,7 +254,7 @@ export class Stmt1BindParams extends StmtBindParams implements IDataEncoder { throw new TaosError( ErrorCode.ERR_INVALID_PARAMS, "getColumString params is invalid! param_type:=" + - typeof params[i] + typeof params[i] ); } } else { @@ -371,7 +371,7 @@ export class Stmt1BindParams extends StmtBindParams implements IDataEncoder { throw new TaosError( ErrorCode.ERR_INVALID_PARAMS, "getColumString params is invalid! param_type:=" + - typeof params[i] + typeof params[i] ); } } else { diff --git a/nodejs/src/stmt/wsParams2.ts b/nodejs/src/stmt/wsParams2.ts index 91674ffb..e217a76c 100644 --- a/nodejs/src/stmt/wsParams2.ts +++ b/nodejs/src/stmt/wsParams2.ts @@ -41,14 +41,13 @@ export class Stmt2BindParams extends StmtBindParams implements IDataEncoder { if (this._fieldParams[this.paramIndex]) { if ( this._fieldParams[this.paramIndex].dataType !== - dataType || + dataType || this._fieldParams[this.paramIndex].columnType !== - columnType + columnType ) { throw new TaosError( ErrorCode.ERR_INVALID_PARAMS, - `StmtBindParams params type is not match! ${ - this.paramIndex + `StmtBindParams params type is not match! ${this.paramIndex } ${this.paramsCount} ${JSONBig.stringify({ dataType, columnType, @@ -206,7 +205,7 @@ export class Stmt2BindParams extends StmtBindParams implements IDataEncoder { throw new TaosError( ErrorCode.ERR_INVALID_PARAMS, "getColumString params is invalid! param_type:=" + - typeof params[i] + typeof params[i] ); } } else { diff --git a/nodejs/src/stmt/wsProto.ts b/nodejs/src/stmt/wsProto.ts index 4c61ac5d..47e12ccb 100644 --- a/nodejs/src/stmt/wsProto.ts +++ b/nodejs/src/stmt/wsProto.ts @@ -279,8 +279,8 @@ export function stmt2BinaryBlockEncode( view.setInt32( offset, headerSize + - result.totalTableNameSize + - 2 * stmtTableInfoList.length, + result.totalTableNameSize + + 2 * stmtTableInfoList.length, true ); } else { @@ -312,7 +312,7 @@ export function stmt2BinaryBlockEncode( let dataOffset = offset + result.tableNameSizeList.length * - TDengineTypeLength[TDengineTypeCode.SMALLINT]; + TDengineTypeLength[TDengineTypeCode.SMALLINT]; for (let i = 0; i < listLength; i++) { view.setInt16(offset, result.tableNameSizeList[i], true); offset += TDengineTypeLength[TDengineTypeCode.SMALLINT]; @@ -337,7 +337,7 @@ export function stmt2BinaryBlockEncode( let dataOffset = offset + result.tagSizeList.length * - TDengineTypeLength[TDengineTypeCode.INT]; + TDengineTypeLength[TDengineTypeCode.INT]; for (let i = 0; i < listLength; i++) { view.setInt32(offset, result.tagSizeList[i], true); offset += TDengineTypeLength[TDengineTypeCode.INT]; @@ -366,7 +366,7 @@ export function stmt2BinaryBlockEncode( let dataOffset = offset + result.colSizeList.length * - TDengineTypeLength[TDengineTypeCode.INT]; + TDengineTypeLength[TDengineTypeCode.INT]; for (let i = 0; i < listLength; i++) { view.setInt32(offset, result.colSizeList[i], true); offset += TDengineTypeLength[TDengineTypeCode.INT]; diff --git a/nodejs/src/tmq/tmqResponse.ts b/nodejs/src/tmq/tmqResponse.ts index 6cf95dc3..556ff2e3 100644 --- a/nodejs/src/tmq/tmqResponse.ts +++ b/nodejs/src/tmq/tmqResponse.ts @@ -163,17 +163,15 @@ export class WSTmqFetchBlockInfo { dataBuffer = this.parseSchemaInfo(dataView, offset); rows += this.parseTmqBlock(dataView, 1); } - // const parseEndTime = new Date().getTime(); - // console.log("------------->", parseEndTime- parseStartTime, rows); logger.info( "parseBlockInfos blockNum=" + - blockNum + - ", withTableName=" + - this.withTableName + - ", withSchema=" + - this.withSchema + - ", rows=" + - rows + blockNum + + ", withTableName=" + + this.withTableName + + ", withSchema=" + + this.withSchema + + ", rows=" + + rows ); return rows; } diff --git a/nodejs/src/tmq/wsTmq.ts b/nodejs/src/tmq/wsTmq.ts index 19ad079f..49d61a9c 100644 --- a/nodejs/src/tmq/wsTmq.ts +++ b/nodejs/src/tmq/wsTmq.ts @@ -343,7 +343,7 @@ export class WsConsumer { ); logger.debug( "[WSTmqFetchBlockInfo.fetchBlockData]===>" + - wsTmqResponse.taosResult + wsTmqResponse.taosResult ); if (wsTmqResponse.rows > 0) { return true; diff --git a/nodejs/test/bulkPulling/queryTables.test.ts b/nodejs/test/bulkPulling/queryTables.test.ts index 49fd6269..048280e9 100644 --- a/nodejs/test/bulkPulling/queryTables.test.ts +++ b/nodejs/test/bulkPulling/queryTables.test.ts @@ -14,7 +14,7 @@ import { tableMeta, tagMeta, } from "../utils"; -// const DSN = 'ws://root:taosdata@127.0.0.1:6041' + let dsn = "ws://root:taosdata@localhost:6041"; let conf: WSConfig = new WSConfig(dsn); const resultMap: Map = new Map(); @@ -337,7 +337,6 @@ describe("ws.query(stable)", () => { for (let i = 0; i < actualData.length; i++) { actualData[i].forEach((d, index) => { - // // console.log(i, index, d, expectData[i][index]) if ( expectMeta[index].name == "geo" || expectMeta[index].name == "vbinary" @@ -379,9 +378,7 @@ describe("ws.query(stable)", () => { let ws = await WsSql.open(conf); await ws.exec(useDB); let insertCN = insertStable(tableCNValues, stableCNTags, stableCN); - // console.log(insertCN) let insertRes = await ws.exec(insertCN); - // console.log(insertRes) expect(insertRes.getAffectRows()).toBe(5); let queryRes = await ws.exec(selectStableCN); @@ -443,7 +440,6 @@ describe("ws.query(table)", () => { let ws = await WsSql.open(conf); await ws.exec(useDB); let insert = insertNTable(tableValues, table); - // console.log(insert) let insertRes = await ws.exec(insert); expect(insertRes.getAffectRows()).toBe(5); @@ -456,7 +452,6 @@ describe("ws.query(table)", () => { await ws.close(); if (actualData && actualMeta) { actualMeta.forEach((meta, index) => { - // console.log(meta,expectMeta[index]); expect(meta.name).toBe(expectMeta[index].name); expect(meta.type).toBe(expectMeta[index].type); expect(meta.length).toBe(expectMeta[index].length); @@ -483,9 +478,7 @@ describe("ws.query(table)", () => { let ws = await WsSql.open(conf); await ws.exec(useDB); let insertCN = insertNTable(tableCNValues, tableCN); - // console.log(insertCN) let insertRes = await ws.exec(insertCN); - // console.log(insertRes) expect(insertRes.getAffectRows()).toBe(5); let queryRes = await ws.exec(selectTableCN); @@ -497,8 +490,6 @@ describe("ws.query(table)", () => { await ws.close(); if (actualData && actualMeta) { actualMeta.forEach((meta, index) => { - // console.log(meta, expectMeta[index]); - expect(meta.name).toBe(expectMeta[index].name); expect(meta.type).toBe(expectMeta[index].type); expect(meta.length).toBe(expectMeta[index].length); @@ -527,7 +518,6 @@ describe("ws.query(jsonTable)", () => { let ws = await WsSql.open(conf); await ws.exec(useDB); let insert = insertStable(tableValues, jsonTags, jsonTable); - // console.log(insert) let insertRes = await ws.exec(insert); expect(insertRes.getAffectRows()).toBe(5); @@ -567,7 +557,6 @@ describe("ws.query(jsonTable)", () => { let ws = await WsSql.open(conf); await ws.exec(useDB); let insert = insertStable(tableCNValues, jsonTagsCN, jsonTableCN); - // console.log(insert) let insertRes = await ws.exec(insert); expect(insertRes.getAffectRows()).toBe(5); @@ -610,5 +599,3 @@ afterAll(async () => { await ws.close(); WebSocketConnectionPool.instance().destroyed(); }); - -//--detectOpenHandles --maxConcurrency=1 --forceExit diff --git a/nodejs/test/bulkPulling/sql.test.ts b/nodejs/test/bulkPulling/sql.test.ts index a7474205..0a6a509e 100644 --- a/nodejs/test/bulkPulling/sql.test.ts +++ b/nodejs/test/bulkPulling/sql.test.ts @@ -2,7 +2,7 @@ import { WebSocketConnectionPool } from "../../src/client/wsConnectorPool"; import { WSConfig } from "../../src/common/config"; import { WsSql } from "../../src/sql/wsSql"; import { Sleep } from "../utils"; -import logger, { setLevel } from "../../src/common/log"; +import { setLevel } from "../../src/common/log"; let dns = "ws://localhost:6041"; let password1 = "Ab1!@#$%,.:?<>;~"; @@ -221,6 +221,50 @@ describe("TDWebSocket.WsSql()", () => { await wsRows.close(); await wsSql.close(); }); + + test("timestamp order check", async () => { + const conf: WSConfig = new WSConfig(dns); + conf.setUser("root"); + conf.setPwd("taosdata"); + + const wsSql = await WsSql.open(conf); + await wsSql.exec("use sql_test"); + await wsSql.exec("drop table if exists t_order"); + await wsSql.exec("create table t_order (ts timestamp, c1 int)"); + await wsSql.exec("insert into t_order values (1726803356466, 1)"); + await wsSql.exec("insert into t_order values (1726803357466, 2)"); + await wsSql.exec("insert into t_order values (1726803358466, 3)"); + + const expectRowsAsc = [ + [1726803356466n, 1], + [1726803357466n, 2], + [1726803358466n, 3], + ]; + const expectRowsDesc = expectRowsAsc.slice().reverse(); + + const actualRowsAsc = []; + const actualRowsDesc = []; + + const rowsAsc = await wsSql.query("select * from t_order order by ts asc"); + while (await rowsAsc.next()) { + const data = rowsAsc.getData(); + if (!data) break; + actualRowsAsc.push(data); + } + await rowsAsc.close(); + expect(actualRowsAsc).toEqual(expectRowsAsc); + + const rowsDesc = await wsSql.query("select * from t_order order by ts desc"); + while (await rowsDesc.next()) { + const data = rowsDesc.getData(); + if (!data) break; + actualRowsDesc.push(data); + } + await rowsDesc.close(); + expect(actualRowsDesc).toEqual(expectRowsDesc); + + await wsSql.close(); + }); }); afterAll(async () => {