diff --git a/src/connector/nodejs/examples/stmtBindParamBatchSample.js b/src/connector/nodejs/examples/stmtBindParamBatchSample.js index 030958bfd16faf88f79c6d4476defb76c0a3e990..c7748790875a5d7e99482dbf1266917fd2882231 100755 --- a/src/connector/nodejs/examples/stmtBindParamBatchSample.js +++ b/src/connector/nodejs/examples/stmtBindParamBatchSample.js @@ -32,7 +32,7 @@ function stmtBindParamBatchSample() { `f32 float,` + `d64 double,` + `bnr binary(20),` + - `blob nchar(20),` + + `nchr nchar(20),` + `u8 tinyint unsigned,` + `u16 smallint unsigned,` + `u32 int unsigned,` + @@ -46,7 +46,7 @@ function stmtBindParamBatchSample() { `t_f32 float,` + `t_d64 double,` + `t_bnr binary(20),` + - `t_blob nchar(20),` + + `t_nchr nchar(20),` + `t_u8 tinyint unsigned,` + `t_u16 smallint unsigned,` + `t_u32 int unsigned,` + @@ -89,7 +89,7 @@ function stmtBindParamBatchSample() { tags.bindNchar('TDengine数据'); tags.bindUTinyInt(254); tags.bindUSmallInt(65534); - tags.bindUInt(4294967290 / 2); + tags.bindUInt(4294967290); tags.bindUBigInt(164243520000011111n); cursor.stmtInit(); diff --git a/src/connector/nodejs/examples/stmtBindParamSample.js b/src/connector/nodejs/examples/stmtBindParamSample.js index ee1354aff0a1052a67d961de39c147c6cbe616dd..57c097d8cf1215b60a3ce386eb4b60f2005e7c87 100644 --- a/src/connector/nodejs/examples/stmtBindParamSample.js +++ b/src/connector/nodejs/examples/stmtBindParamSample.js @@ -34,7 +34,7 @@ function stmtBindParamSample() { `f32 float,` + `d64 double,` + `bnr binary(20),` + - `blob nchar(20),` + + `nchr nchar(20),` + `u8 tinyint unsigned,` + `u16 smallint unsigned,` + `u32 int unsigned,` + diff --git a/src/connector/nodejs/examples/stmtBindSingleParamBatchSample.js b/src/connector/nodejs/examples/stmtBindSingleParamBatchSample.js index 3b424b8d0cdc0d18997c2224fdac499e42c0c57d..938de75b7f3314ce3db32294de9d30b609e480b8 100755 --- a/src/connector/nodejs/examples/stmtBindSingleParamBatchSample.js +++ b/src/connector/nodejs/examples/stmtBindSingleParamBatchSample.js @@ -33,7 +33,7 @@ function stmtSingleParaBatchSample() { `f32 float,` + `d64 double,` + `bnr binary(20),` + - `blob nchar(20),` + + `nchr nchar(20),` + `u8 tinyint unsigned,` + `u16 smallint unsigned,` + `u32 int unsigned,` + diff --git a/src/connector/nodejs/examples/stmtUseResultSample.js b/src/connector/nodejs/examples/stmtUseResultSample.js index b9f55545b0892d575c952308febfa9055a4f570a..21e2fbf378e763c1e6f26692f31b1c85010c86fb 100755 --- a/src/connector/nodejs/examples/stmtUseResultSample.js +++ b/src/connector/nodejs/examples/stmtUseResultSample.js @@ -32,7 +32,7 @@ function stmtUseResultSample() { `f32 float,` + `d64 double,` + `bnr binary(20),` + - `blob nchar(20),` + + `nchr nchar(20),` + `u8 tinyint unsigned,` + `u16 smallint unsigned,` + `u32 int unsigned,` + diff --git a/src/connector/nodejs/examples/taosBindParamSample.js b/src/connector/nodejs/examples/taosBindParamSample.js index 3913b741d060549810957526bb9963958f3d48e4..cf8f0a263555844535916f91b1492afb36ef536e 100644 --- a/src/connector/nodejs/examples/taosBindParamSample.js +++ b/src/connector/nodejs/examples/taosBindParamSample.js @@ -34,7 +34,7 @@ function stmtBindParamSample(){ `f32 float,`+ `d64 double,`+ `bnr binary(20),`+ - `blob nchar(20),`+ + `nchr nchar(20),`+ `u8 tinyint unsigned,`+ `u16 smallint unsigned,`+ `u32 int unsigned,`+ diff --git a/src/connector/nodejs/nodetaos/taosMultiBind.js b/src/connector/nodejs/nodetaos/taosMultiBind.js index deead6d2f702ea2d40584a2c57574da5f75f4de7..d4134a9ef6df29f196e9b573a5f8e2e524de21ed 100755 --- a/src/connector/nodejs/nodetaos/taosMultiBind.js +++ b/src/connector/nodejs/nodetaos/taosMultiBind.js @@ -452,7 +452,8 @@ class TaosMultiBind { if (element == null || element == undefined) { ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char); } else { - ref.writeInt64LE(mbindBufferBuf, index * ref.types.uint64.size, element.toString()) + + ref.writeUInt64LE(mbindBufferBuf, index * ref.types.uint64.size, element.toString()) ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char); } diff --git a/src/connector/nodejs/test/cases/test.cases.js b/src/connector/nodejs/test/cases/test.cases.js index 3aa7ab96e5575f6b9c36566b69823e1d246efa66..6cf723331ef4330d56ee5d0db38e0a30b57eadb3 100644 --- a/src/connector/nodejs/test/cases/test.cases.js +++ b/src/connector/nodejs/test/cases/test.cases.js @@ -222,7 +222,7 @@ describe("test unsigned type", () => { ",us2 smallint unsigned" + ",ui4 int unsigned" + ",ubi8 bigint unsigned" + - ",desc_blob nchar(200)" + + ",desc_nchr nchar(200)" + ");"; executeUpdate(createSql); let expectResField = getFieldArr(getFeildsFromDll(createSql)); @@ -268,7 +268,7 @@ describe("test unsigned type", () => { ",us2 smallint unsigned" + ",ui4 int unsigned" + ",ubi8 bigint unsigned" + - ",desc_blob nchar(200)" + + ",desc_nchr nchar(200)" + ");"; executeUpdate(createSql); let expectResField = getFieldArr(getFeildsFromDll(createSql)); @@ -315,7 +315,7 @@ describe("test unsigned type", () => { ",us2 smallint unsigned" + ",ui4 int unsigned" + ",ubi8 bigint unsigned" + - ",desc_blob nchar(200)" + + ",desc_nchr nchar(200)" + ");"; executeUpdate(createSql); let expectResField = getFieldArr(getFeildsFromDll(createSql)); @@ -384,7 +384,7 @@ describe("test cn character", () => { `desc:create,insert,query with cn characters;` + `filename:${fileName};` + `result:${result}`, () => { - createSql = "create table if not exists nchartest_s(ts timestamp,value int,text binary(200),detail nchar(200))tags(tag_bi binary(50),tag_blob nchar(50));" + createSql = "create table if not exists nchartest_s(ts timestamp,value int,text binary(200),detail nchar(200))tags(tag_bi binary(50),tag_nchr nchar(50));" executeUpdate(createSql); let expectResField = getFieldArr(getFeildsFromDll(createSql)); let colData = [1641827743305, 1, 'taosdata', 'tdengine' diff --git a/src/connector/nodejs/test/cases/test.stmt.js b/src/connector/nodejs/test/cases/test.stmt.js new file mode 100644 index 0000000000000000000000000000000000000000..235178bb7c59ad5b6f15d179a55979f71a9e268a --- /dev/null +++ b/src/connector/nodejs/test/cases/test.stmt.js @@ -0,0 +1,915 @@ +const taos = require('../../tdengine'); +const { getFeildsFromDll, buildInsertSql, getFieldArr, getResData } = require('../utils/utilTools') + +const author = 'xiaolei'; +const result = 'passed'; +const fileName = __filename.slice(__dirname.length + 1); + +// This is a taos connection +let conn; +// This is a Cursor +let c1; + +// prepare data +let dbName = 'node_test_stmt_db'; +let tsArr = [1642435200000, 1642435300000, 1642435400000, 1642435500000, 1642435600000]; +let boolArr = [true, false, true, false, null]; +let tinyIntArr = [-127, 3, 127, 0, null]; +let smallIntArr = [-32767, 16, 32767, 0, null]; +let intArr = [-2147483647, 17, 2147483647, 0, null]; +let bigIntArr = [-9223372036854775807n, 9223372036854775807n, 18n, 0n, null]; +let floatArr = [3.4028234663852886e+38, -3.4028234663852886e+38, 19, 0, null]; +let doubleArr = [1.7976931348623157e+308, -1.7976931348623157e+308, 20, 0, null]; +let binaryArr = ['TDengine_Binary', 'taosdata涛思数据', '~!@#$%^&*()', '', null]; +let ncharArr = ['TDengine_Nchar', 'taosdata涛思数据', '~!@#$$%^&*()', '', null]; +let uTinyIntArr = [0, 127, 254, 23, null]; +let uSmallIntArr = [0, 256, 65534, 24, null]; +let uIntArr = [0, 1233, 4294967294, 25, null]; +let uBigIntArr = [0n, 36424354000001111n, 18446744073709551614n, 26n, null]; + +//prepare tag data. +let tagData1 = [true, 1, 32767, 1234555, -164243520000011111n, 214.02, 2.01, 'taosdata涛思数据', 'TDengine数据', 254, 65534, 4294967290 / 2, 164243520000011111n]; +let tagData2 = [true, 2, 32767, 1234555, -164243520000011111n, 214.02, 2.01, 'taosdata涛思数据', 'TDengine数据', 254, 65534, 4294967290 / 2, 164243520000011111n]; +let tagData3 = [true, 3, 32767, 1234555, -164243520000011111n, 214.02, 2.01, 'taosdata涛思数据', 'TDengine数据', 254, 65534, 4294967290 / 2, 164243520000011111n]; + +/** + * Combine individual array of every tdengine type that + * has been declared and then return a new array. + * @returns return data array. + */ +function getBindData() { + let bindDataArr = []; + for (let i = 0; i < 5; i++) { + bindDataArr.push(tsArr[i]); + bindDataArr.push(boolArr[i]); + bindDataArr.push(tinyIntArr[i]); + bindDataArr.push(smallIntArr[i]); + bindDataArr.push(intArr[i]); + bindDataArr.push(bigIntArr[i]); + bindDataArr.push(floatArr[i]); + bindDataArr.push(doubleArr[i]); + bindDataArr.push(binaryArr[i]); + bindDataArr.push(ncharArr[i]); + bindDataArr.push(uTinyIntArr[i]); + bindDataArr.push(uSmallIntArr[i]); + bindDataArr.push(uIntArr[i]); + bindDataArr.push(uBigIntArr[i]); + } + return bindDataArr; +} + +function executeUpdate(sql) { + console.log(sql); + c1.execute(sql); +} + +function executeQuery(sql) { + c1.execute(sql, { quiet: true }) + var data = c1.fetchall(); + let fields = c1.fields; + let resArr = []; + + data.forEach(row => { + row.forEach(data => { + if (data instanceof Date) { + // console.log("date obejct:"+data.valueOf()); + resArr.push(data.taosTimestamp()); + } else { + // console.log("not date:"+data); + resArr.push(data); + } + // console.log(data instanceof Date) + }) + }) + return { resData: resArr, resFeilds: fields }; +} + +beforeAll(() => { + conn = taos.connect({ host: "127.0.0.1", user: "root", password: "taosdata", config: "/etc/taos", port: 10 }); + c1 = conn.cursor(); + executeUpdate(`create database if not exists ${dbName} keep 3650;`); + executeUpdate(`use ${dbName};`); +}); + +// Clears the database and adds some testing data. +// Jest will wait for this promise to resolve before running tests. +afterAll(() => { + executeUpdate(`drop database if exists ${dbName};`); + conn.close(); +}); + +describe("stmt_bind_single_param", () => { + test(`name:bindSingleParamWithOneTable;` + + `author:${author};` + + `desc:Using stmtBindSingleParam() bind one table in a batch;` + + `filename:${fileName};` + + `result:${result}`, () => { + let table = 'bindsingleparambatch_121'; + let createSql = `create table if not exists ${table} ` + + `(ts timestamp,` + + `bl bool,` + + `i8 tinyint,` + + `i16 smallint,` + + `i32 int,` + + `i64 bigint,` + + `f32 float,` + + `d64 double,` + + `bnr binary(20),` + + `nchr nchar(20),` + + `u8 tinyint unsigned,` + + `u16 smallint unsigned,` + + `u32 int unsigned,` + + `u64 bigint unsigned` + + `)tags(` + + `t_bl bool,` + + `t_i8 tinyint,` + + `t_i16 smallint,` + + `t_i32 int,` + + `t_i64 bigint,` + + `t_f32 float,` + + `t_d64 double,` + + `t_bnr binary(20),` + + `t_nchr nchar(20),` + + `t_u8 tinyint unsigned,` + + `t_u16 smallint unsigned,` + + `t_u32 int unsigned,` + + `t_u64 bigint unsigned` + + `);`; + let insertSql = `insert into ? using ${table} tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?);`; + let querySql = `select * from ${table}`; + let expectResField = getFieldArr(getFeildsFromDll(createSql)); + let expectResData = getResData(getBindData(), tagData1, 14); + + // prepare tag TAOS_BIND + let tagBind1 = new taos.TaosBind(14); + tagBind1.bindBool(true); + tagBind1.bindTinyInt(1); + tagBind1.bindSmallInt(32767); + tagBind1.bindInt(1234555); + tagBind1.bindBigInt(-164243520000011111n); + tagBind1.bindFloat(214.02); + tagBind1.bindDouble(2.01); + tagBind1.bindBinary('taosdata涛思数据'); + tagBind1.bindNchar('TDengine数据'); + tagBind1.bindUTinyInt(254); + tagBind1.bindUSmallInt(65534); + tagBind1.bindUInt(4294967290 / 2); + tagBind1.bindUBigInt(164243520000011111n); + + //Prepare TAOS_MULTI_BIND data + let mBind1 = new taos.TaosMultiBind(); + + executeUpdate(createSql); + c1.stmtInit(); + c1.stmtPrepare(insertSql); + c1.stmtSetTbnameTags(`${table}_s01`, tagBind1.getBind()); + c1.stmtBindSingleParamBatch(mBind1.multiBindTimestamp(tsArr), 0); + c1.stmtBindSingleParamBatch(mBind1.multiBindBool(boolArr), 1); + c1.stmtBindSingleParamBatch(mBind1.multiBindTinyInt(tinyIntArr), 2); + c1.stmtBindSingleParamBatch(mBind1.multiBindSmallInt(smallIntArr), 3); + c1.stmtBindSingleParamBatch(mBind1.multiBindInt(intArr), 4); + c1.stmtBindSingleParamBatch(mBind1.multiBindBigInt(bigIntArr), 5); + c1.stmtBindSingleParamBatch(mBind1.multiBindFloat(floatArr), 6); + c1.stmtBindSingleParamBatch(mBind1.multiBindDouble(doubleArr), 7); + c1.stmtBindSingleParamBatch(mBind1.multiBindBinary(binaryArr), 8); + c1.stmtBindSingleParamBatch(mBind1.multiBindNchar(ncharArr), 9); + c1.stmtBindSingleParamBatch(mBind1.multiBindUTinyInt(uTinyIntArr), 10); + c1.stmtBindSingleParamBatch(mBind1.multiBindUSmallInt(uSmallIntArr), 11); + c1.stmtBindSingleParamBatch(mBind1.multiBindUInt(uIntArr), 12); + c1.stmtBindSingleParamBatch(mBind1.multiBindUBigInt(uBigIntArr), 13); + c1.stmtAddBatch(); + c1.stmtExecute(); + c1.stmtClose(); + + let result = executeQuery(querySql); + let actualResData = result.resData; + let actualResFields = result.resFeilds; + + //assert result data length + expect(expectResData.length).toEqual(actualResData.length); + //assert result data + expectResData.forEach((item, index) => { + expect(item).toEqual(actualResData[index]); + }); + + //assert result meta data + expectResField.forEach((item, index) => { + expect(item).toEqual(actualResFields[index]) + }) + }); + + test(`name:bindSingleParamWithMultiTable;` + + `author:${author};` + + `desc:Using stmtBindSingleParam() bind multiple tables in a batch;` + + `filename:${fileName};` + + `result:${result}`, () => { + let table = 'bindsingleparambatch_m21';//bind multiple table to one batch + let createSql = `create table if not exists ${table} ` + + `(ts timestamp,` + + `bl bool,` + + `i8 tinyint,` + + `i16 smallint,` + + `i32 int,` + + `i64 bigint,` + + `f32 float,` + + `d64 double,` + + `bnr binary(20),` + + `nchr nchar(20),` + + `u8 tinyint unsigned,` + + `u16 smallint unsigned,` + + `u32 int unsigned,` + + `u64 bigint unsigned` + + `)tags(` + + `t_bl bool,` + + `t_i8 tinyint,` + + `t_i16 smallint,` + + `t_i32 int,` + + `t_i64 bigint,` + + `t_f32 float,` + + `t_d64 double,` + + `t_bnr binary(20),` + + `t_nchr nchar(20),` + + `t_u8 tinyint unsigned,` + + `t_u16 smallint unsigned,` + + `t_u32 int unsigned,` + + `t_u64 bigint unsigned` + + `);`; + let insertSql = `insert into ? using ${table} tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?);`; + let querySql = `select * from ${table}`; + let expectResField = getFieldArr(getFeildsFromDll(createSql)); + let expectResData = getResData(getBindData(), tagData1, 14).concat(getResData(getBindData(), tagData2, 14)).concat(getResData(getBindData(), tagData3, 14)); + + // prepare tag TAOS_BIND + let tagBind1 = new taos.TaosBind(14); + tagBind1.bindBool(true); + tagBind1.bindTinyInt(1); + tagBind1.bindSmallInt(32767); + tagBind1.bindInt(1234555); + tagBind1.bindBigInt(-164243520000011111n); + tagBind1.bindFloat(214.02); + tagBind1.bindDouble(2.01); + tagBind1.bindBinary('taosdata涛思数据'); + tagBind1.bindNchar('TDengine数据'); + tagBind1.bindUTinyInt(254); + tagBind1.bindUSmallInt(65534); + tagBind1.bindUInt(4294967290 / 2); + tagBind1.bindUBigInt(164243520000011111n); + + let tagBind2 = new taos.TaosBind(14); + tagBind2.bindBool(true); + tagBind2.bindTinyInt(2); + tagBind2.bindSmallInt(32767); + tagBind2.bindInt(1234555); + tagBind2.bindBigInt(-164243520000011111n); + tagBind2.bindFloat(214.02); + tagBind2.bindDouble(2.01); + tagBind2.bindBinary('taosdata涛思数据'); + tagBind2.bindNchar('TDengine数据'); + tagBind2.bindUTinyInt(254); + tagBind2.bindUSmallInt(65534); + tagBind2.bindUInt(4294967290 / 2); + tagBind2.bindUBigInt(164243520000011111n); + + let tagBind3 = new taos.TaosBind(14); + tagBind3.bindBool(true); + tagBind3.bindTinyInt(3); + tagBind3.bindSmallInt(32767); + tagBind3.bindInt(1234555); + tagBind3.bindBigInt(-164243520000011111n); + tagBind3.bindFloat(214.02); + tagBind3.bindDouble(2.01); + tagBind3.bindBinary('taosdata涛思数据'); + tagBind3.bindNchar('TDengine数据'); + tagBind3.bindUTinyInt(254); + tagBind3.bindUSmallInt(65534); + tagBind3.bindUInt(4294967290 / 2); + tagBind3.bindUBigInt(164243520000011111n); + + //Prepare TAOS_MULTI_BIND data + let mBind = new taos.TaosMultiBind(); + + executeUpdate(createSql); + c1.stmtInit(); + c1.stmtPrepare(insertSql); + // ========bind for 1st table ============= + c1.stmtSetTbnameTags(`${table}_s01`, tagBind1.getBind()); + c1.stmtBindSingleParamBatch(mBind.multiBindTimestamp(tsArr), 0); + c1.stmtBindSingleParamBatch(mBind.multiBindBool(boolArr), 1); + c1.stmtBindSingleParamBatch(mBind.multiBindTinyInt(tinyIntArr), 2); + c1.stmtBindSingleParamBatch(mBind.multiBindSmallInt(smallIntArr), 3); + c1.stmtBindSingleParamBatch(mBind.multiBindInt(intArr), 4); + c1.stmtBindSingleParamBatch(mBind.multiBindBigInt(bigIntArr), 5); + c1.stmtBindSingleParamBatch(mBind.multiBindFloat(floatArr), 6); + c1.stmtBindSingleParamBatch(mBind.multiBindDouble(doubleArr), 7); + c1.stmtBindSingleParamBatch(mBind.multiBindBinary(binaryArr), 8); + c1.stmtBindSingleParamBatch(mBind.multiBindNchar(ncharArr), 9); + c1.stmtBindSingleParamBatch(mBind.multiBindUTinyInt(uTinyIntArr), 10); + c1.stmtBindSingleParamBatch(mBind.multiBindUSmallInt(uSmallIntArr), 11); + c1.stmtBindSingleParamBatch(mBind.multiBindUInt(uIntArr), 12); + c1.stmtBindSingleParamBatch(mBind.multiBindUBigInt(uBigIntArr), 13); + c1.stmtAddBatch(); + // c1.stmtExecute(); + + // ========bind for 2nd table ============= + c1.stmtSetTbnameTags(`${table}_s02`, tagBind2.getBind()); + c1.stmtBindSingleParamBatch(mBind.multiBindTimestamp(tsArr), 0); + c1.stmtBindSingleParamBatch(mBind.multiBindBool(boolArr), 1); + c1.stmtBindSingleParamBatch(mBind.multiBindTinyInt(tinyIntArr), 2); + c1.stmtBindSingleParamBatch(mBind.multiBindSmallInt(smallIntArr), 3); + c1.stmtBindSingleParamBatch(mBind.multiBindInt(intArr), 4); + c1.stmtBindSingleParamBatch(mBind.multiBindBigInt(bigIntArr), 5); + c1.stmtBindSingleParamBatch(mBind.multiBindFloat(floatArr), 6); + c1.stmtBindSingleParamBatch(mBind.multiBindDouble(doubleArr), 7); + c1.stmtBindSingleParamBatch(mBind.multiBindBinary(binaryArr), 8); + c1.stmtBindSingleParamBatch(mBind.multiBindNchar(ncharArr), 9); + c1.stmtBindSingleParamBatch(mBind.multiBindUTinyInt(uTinyIntArr), 10); + c1.stmtBindSingleParamBatch(mBind.multiBindUSmallInt(uSmallIntArr), 11); + c1.stmtBindSingleParamBatch(mBind.multiBindUInt(uIntArr), 12); + c1.stmtBindSingleParamBatch(mBind.multiBindUBigInt(uBigIntArr), 13); + c1.stmtAddBatch(); + // c1.stmtExecute(); + + // ========bind for 3rd table ============= + c1.stmtSetTbnameTags(`${table}_s0`, tagBind3.getBind()); + c1.stmtBindSingleParamBatch(mBind.multiBindTimestamp(tsArr), 0); + c1.stmtBindSingleParamBatch(mBind.multiBindBool(boolArr), 1); + c1.stmtBindSingleParamBatch(mBind.multiBindTinyInt(tinyIntArr), 2); + c1.stmtBindSingleParamBatch(mBind.multiBindSmallInt(smallIntArr), 3); + c1.stmtBindSingleParamBatch(mBind.multiBindInt(intArr), 4); + c1.stmtBindSingleParamBatch(mBind.multiBindBigInt(bigIntArr), 5); + c1.stmtBindSingleParamBatch(mBind.multiBindFloat(floatArr), 6); + c1.stmtBindSingleParamBatch(mBind.multiBindDouble(doubleArr), 7); + c1.stmtBindSingleParamBatch(mBind.multiBindBinary(binaryArr), 8); + c1.stmtBindSingleParamBatch(mBind.multiBindNchar(ncharArr), 9); + c1.stmtBindSingleParamBatch(mBind.multiBindUTinyInt(uTinyIntArr), 10); + c1.stmtBindSingleParamBatch(mBind.multiBindUSmallInt(uSmallIntArr), 11); + c1.stmtBindSingleParamBatch(mBind.multiBindUInt(uIntArr), 12); + c1.stmtBindSingleParamBatch(mBind.multiBindUBigInt(uBigIntArr), 13); + c1.stmtAddBatch(); + c1.stmtExecute(); + c1.stmtClose(); + + let result = executeQuery(querySql); + let actualResData = result.resData; + let actualResFields = result.resFeilds; + + //assert result data length + expect(expectResData.length).toEqual(actualResData.length); + //assert result data + expectResData.forEach((item, index) => { + expect(item).toEqual(actualResData[index]); + }); + //assert result meta data + expectResField.forEach((item, index) => { + expect(item).toEqual(actualResFields[index]) + }) + }); +}) + +describe("stmt_bind_para_batch", () => { + test(`name:bindParamBatchWithOneTable;` + + `author:${author};` + + `desc:Using stmtBindParamBatch() bind one table in a batch;` + + `filename:${fileName};` + + `result:${result}`, () => { + let table = 'bindparambatch_121';//bind one table to one batch + let createSql = `create table if not exists ${table} ` + + `(ts timestamp,` + + `bl bool,` + + `i8 tinyint,` + + `i16 smallint,` + + `i32 int,` + + `i64 bigint,` + + `f32 float,` + + `d64 double,` + + `bnr binary(20),` + + `nchr nchar(20),` + + `u8 tinyint unsigned,` + + `u16 smallint unsigned,` + + `u32 int unsigned,` + + `u64 bigint unsigned` + + `)tags(` + + `t_bl bool,` + + `t_i8 tinyint,` + + `t_i16 smallint,` + + `t_i32 int,` + + `t_i64 bigint,` + + `t_f32 float,` + + `t_d64 double,` + + `t_bnr binary(20),` + + `t_nchr nchar(20),` + + `t_u8 tinyint unsigned,` + + `t_u16 smallint unsigned,` + + `t_u32 int unsigned,` + + `t_u64 bigint unsigned` + + `);`; + let insertSql = `insert into ? using ${table} tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?);`; + let querySql = `select * from ${table}`; + let expectResField = getFieldArr(getFeildsFromDll(createSql)); + let expectResData = getResData(getBindData(), tagData1, 14); + + //prepare tag TAO_BIND + let tagBind = new taos.TaosBind(14); + tagBind.bindBool(true); + tagBind.bindTinyInt(1); + tagBind.bindSmallInt(32767); + tagBind.bindInt(1234555); + tagBind.bindBigInt(-164243520000011111n); + tagBind.bindFloat(214.02); + tagBind.bindDouble(2.01); + tagBind.bindBinary('taosdata涛思数据'); + tagBind.bindNchar('TDengine数据'); + tagBind.bindUTinyInt(254); + tagBind.bindUSmallInt(65534); + tagBind.bindUInt(4294967290 / 2); + tagBind.bindUBigInt(164243520000011111n); + + //Prepare TAOS_MULTI_BIND data array + let mBinds = new taos.TaosMultiBindArr(14); + mBinds.multiBindTimestamp(tsArr); + mBinds.multiBindBool(boolArr); + mBinds.multiBindTinyInt(tinyIntArr); + mBinds.multiBindSmallInt(smallIntArr); + mBinds.multiBindInt(intArr); + mBinds.multiBindBigInt(bigIntArr); + mBinds.multiBindFloat(floatArr); + mBinds.multiBindDouble(doubleArr); + mBinds.multiBindBinary(binaryArr); + mBinds.multiBindNchar(ncharArr); + mBinds.multiBindUTinyInt(uTinyIntArr); + mBinds.multiBindUSmallInt(uSmallIntArr); + mBinds.multiBindUInt(uIntArr); + mBinds.multiBindUBigInt(uBigIntArr); + + executeUpdate(createSql); + c1.stmtInit(); + c1.stmtPrepare(insertSql); + c1.stmtSetTbnameTags(`${table}_s01`, tagBind.getBind()); + c1.stmtBindParamBatch(mBinds.getMultiBindArr()); + c1.stmtAddBatch(); + c1.stmtExecute(); + c1.stmtClose(); + + let result = executeQuery(querySql); + let actualResData = result.resData; + let actualResFields = result.resFeilds; + + //assert result data length + expect(expectResData.length).toEqual(actualResData.length); + //assert result data + expectResData.forEach((item, index) => { + expect(item).toEqual(actualResData[index]); + }); + + //assert result meta data + expectResField.forEach((item, index) => { + expect(item).toEqual(actualResFields[index]) + }) + }); + + test(`name:bindParamBatchWithMultiTable;` + + `author:${author};` + + `desc:Using stmtBindParamBatch() bind multiple tables in a batch;` + + `filename:${fileName};` + + `result:${result}`, () => { + let table = 'bindparambatch_m21';//bind multiple tables to one batch + let createSql = `create table if not exists ${table} ` + + `(ts timestamp,` + + `bl bool,` + + `i8 tinyint,` + + `i16 smallint,` + + `i32 int,` + + `i64 bigint,` + + `f32 float,` + + `d64 double,` + + `bnr binary(20),` + + `nchr nchar(20),` + + `u8 tinyint unsigned,` + + `u16 smallint unsigned,` + + `u32 int unsigned,` + + `u64 bigint unsigned` + + `)tags(` + + `t_bl bool,` + + `t_i8 tinyint,` + + `t_i16 smallint,` + + `t_i32 int,` + + `t_i64 bigint,` + + `t_f32 float,` + + `t_d64 double,` + + `t_bnr binary(20),` + + `t_nchr nchar(20),` + + `t_u8 tinyint unsigned,` + + `t_u16 smallint unsigned,` + + `t_u32 int unsigned,` + + `t_u64 bigint unsigned` + + `);`; + let insertSql = `insert into ? using ${table} tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?);`; + let querySql = `select * from ${table}`; + let expectResField = getFieldArr(getFeildsFromDll(createSql)); + let expectResData = getResData(getBindData(), tagData1, 14).concat(getResData(getBindData(), tagData2, 14)).concat(getResData(getBindData(), tagData3, 14)); + + + // prepare tag TAOS_BIND + let tagBind1 = new taos.TaosBind(14); + tagBind1.bindBool(true); + tagBind1.bindTinyInt(1); + tagBind1.bindSmallInt(32767); + tagBind1.bindInt(1234555); + tagBind1.bindBigInt(-164243520000011111n); + tagBind1.bindFloat(214.02); + tagBind1.bindDouble(2.01); + tagBind1.bindBinary('taosdata涛思数据'); + tagBind1.bindNchar('TDengine数据'); + tagBind1.bindUTinyInt(254); + tagBind1.bindUSmallInt(65534); + tagBind1.bindUInt(4294967290 / 2); + tagBind1.bindUBigInt(164243520000011111n); + + let tagBind2 = new taos.TaosBind(14); + tagBind2.bindBool(true); + tagBind2.bindTinyInt(2); + tagBind2.bindSmallInt(32767); + tagBind2.bindInt(1234555); + tagBind2.bindBigInt(-164243520000011111n); + tagBind2.bindFloat(214.02); + tagBind2.bindDouble(2.01); + tagBind2.bindBinary('taosdata涛思数据'); + tagBind2.bindNchar('TDengine数据'); + tagBind2.bindUTinyInt(254); + tagBind2.bindUSmallInt(65534); + tagBind2.bindUInt(4294967290 / 2); + tagBind2.bindUBigInt(164243520000011111n); + + let tagBind3 = new taos.TaosBind(14); + tagBind3.bindBool(true); + tagBind3.bindTinyInt(3); + tagBind3.bindSmallInt(32767); + tagBind3.bindInt(1234555); + tagBind3.bindBigInt(-164243520000011111n); + tagBind3.bindFloat(214.02); + tagBind3.bindDouble(2.01); + tagBind3.bindBinary('taosdata涛思数据'); + tagBind3.bindNchar('TDengine数据'); + tagBind3.bindUTinyInt(254); + tagBind3.bindUSmallInt(65534); + tagBind3.bindUInt(4294967290 / 2); + tagBind3.bindUBigInt(164243520000011111n); + + //Prepare TAOS_MULTI_BIND data array + let mBinds = new taos.TaosMultiBindArr(14); + mBinds.multiBindTimestamp(tsArr); + mBinds.multiBindBool(boolArr); + mBinds.multiBindTinyInt(tinyIntArr); + mBinds.multiBindSmallInt(smallIntArr); + mBinds.multiBindInt(intArr); + mBinds.multiBindBigInt(bigIntArr); + mBinds.multiBindFloat(floatArr); + mBinds.multiBindDouble(doubleArr); + mBinds.multiBindBinary(binaryArr); + mBinds.multiBindNchar(ncharArr); + mBinds.multiBindUTinyInt(uTinyIntArr); + mBinds.multiBindUSmallInt(uSmallIntArr); + mBinds.multiBindUInt(uIntArr); + mBinds.multiBindUBigInt(uBigIntArr); + + executeUpdate(createSql); + c1.stmtInit(); + c1.stmtPrepare(insertSql); + // ===========bind for 1st table ========== + c1.stmtSetTbnameTags(`${table}_s01`, tagBind1.getBind()); + c1.stmtBindParamBatch(mBinds.getMultiBindArr()); + c1.stmtAddBatch(); + // c1.stmtExecute(); + + // ===========bind for 2nd table ========== + c1.stmtSetTbnameTags(`${table}_s02`, tagBind2.getBind()); + c1.stmtBindParamBatch(mBinds.getMultiBindArr()); + c1.stmtAddBatch(); + // c1.stmtExecute(); + + // ===========bind for 3rd table ========== + c1.stmtSetTbnameTags(`${table}_s03`, tagBind3.getBind()); + c1.stmtBindParamBatch(mBinds.getMultiBindArr()); + c1.stmtAddBatch(); + c1.stmtExecute(); + c1.stmtClose(); + + let result = executeQuery(querySql); + let actualResData = result.resData; + let actualResFields = result.resFeilds; + + //assert result data length + expect(expectResData.length).toEqual(actualResData.length); + //assert result data + expectResData.forEach((item, index) => { + expect(item).toEqual(actualResData[index]); + }); + + //assert result meta data + expectResField.forEach((item, index) => { + expect(item).toEqual(actualResFields[index]) + }) + + + }); +}) + +describe("stmt_bind_param", () => { + test(`name:bindParamWithOneTable;` + + `author:${author};` + + `desc:using stmtBindParam() bind one table in a batch;` + + `filename:${fileName};` + + `result:${result}`, () => { + let table = 'bindparam_121';//bind one table to one batch + let createSql = `create table if not exists ${table} ` + + `(ts timestamp,` + + `bl bool,` + + `i8 tinyint,` + + `i16 smallint,` + + `i32 int,` + + `i64 bigint,` + + `f32 float,` + + `d64 double,` + + `bnr binary(20),` + + `nchr nchar(20),` + + `u8 tinyint unsigned,` + + `u16 smallint unsigned,` + + `u32 int unsigned,` + + `u64 bigint unsigned` + + `)tags(` + + `t_bl bool,` + + `t_i8 tinyint,` + + `t_i16 smallint,` + + `t_i32 int,` + + `t_i64 bigint,` + + `t_f32 float,` + + `t_d64 double,` + + `t_bnr binary(20),` + + `t_nchr nchar(20),` + + `t_u8 tinyint unsigned,` + + `t_u16 smallint unsigned,` + + `t_u32 int unsigned,` + + `t_u64 bigint unsigned` + + `);`; + let insertSql = `insert into ? using ${table} tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?);`; + let querySql = `select * from ${table}`; + let expectResField = getFieldArr(getFeildsFromDll(createSql)); + let data = getBindData(); + let expectResData = getResData(data, tagData1, 14); + + //prepare tag data + let tags = new taos.TaosBind(13); + tags.bindBool(true); + tags.bindTinyInt(1); + tags.bindSmallInt(32767); + tags.bindInt(1234555); + tags.bindBigInt(-164243520000011111n); + tags.bindFloat(214.02); + tags.bindDouble(2.01); + tags.bindBinary('taosdata涛思数据'); + tags.bindNchar('TDengine数据'); + tags.bindUTinyInt(254); + tags.bindUSmallInt(65534); + tags.bindUInt(4294967290 / 2); + tags.bindUBigInt(164243520000011111n); + executeUpdate(createSql); + + c1.stmtInit(); + c1.stmtPrepare(insertSql); + c1.stmtSetTbnameTags(`${table}_s01`, tags.getBind()); + for (let i = 0; i < data.length - 14; i += 14) { + let bind = new taos.TaosBind(14); + bind.bindTimestamp(data[i]); + bind.bindBool(data[i + 1]); + bind.bindTinyInt(data[i + 2]); + bind.bindSmallInt(data[i + 3]); + bind.bindInt(data[i + 4]); + bind.bindBigInt(data[i + 5]); + bind.bindFloat(data[i + 6]); + bind.bindDouble(data[i + 7]); + bind.bindBinary(data[i + 8]); + bind.bindNchar(data[i + 9]); + bind.bindUTinyInt(data[i + 10]); + bind.bindUSmallInt(data[i + 11]); + bind.bindUInt(data[i + 12]); + bind.bindUBigInt(data[i + 13]); + c1.stmtBindParam(bind.getBind()); + c1.stmtAddBatch(); + } + let bind2 = new taos.TaosBind(14); + bind2.bindTimestamp(data[14 * 4]); + for (let j = 0; j < 13; j++) { + bind2.bindNil(); + } + c1.stmtBindParam(bind2.getBind()); + c1.stmtAddBatch(); + c1.stmtExecute(); + c1.stmtClose(); + + let result = executeQuery(querySql); + let actualResData = result.resData; + let actualResFields = result.resFeilds; + + //assert result data length + expect(expectResData.length).toEqual(actualResData.length); + //assert result data + expectResData.forEach((item, index) => { + expect(item).toEqual(actualResData[index]); + }); + + //assert result meta data + expectResField.forEach((item, index) => { + expect(item).toEqual(actualResFields[index]) + }) + }); + + test(`name:bindParamWithMultiTable;` + + `author:${author};` + + `desc:using stmtBindParam() bind multiple tables in a batch;` + + `filename:${fileName};` + + `result:${result}`, () => { + let table = 'bindparam_m21';//bind one table to one batch + let createSql = `create table if not exists ${table} ` + + `(ts timestamp,` + + `bl bool,` + + `i8 tinyint,` + + `i16 smallint,` + + `i32 int,` + + `i64 bigint,` + + `f32 float,` + + `d64 double,` + + `bnr binary(20),` + + `nchr nchar(20),` + + `u8 tinyint unsigned,` + + `u16 smallint unsigned,` + + `u32 int unsigned,` + + `u64 bigint unsigned` + + `)tags(` + + `t_bl bool,` + + `t_i8 tinyint,` + + `t_i16 smallint,` + + `t_i32 int,` + + `t_i64 bigint,` + + `t_f32 float,` + + `t_d64 double,` + + `t_bnr binary(20),` + + `t_nchr nchar(20),` + + `t_u8 tinyint unsigned,` + + `t_u16 smallint unsigned,` + + `t_u32 int unsigned,` + + `t_u64 bigint unsigned` + + `);`; + let insertSql = `insert into ? using ${table} tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?);`; + let querySql = `select * from ${table}`; + let expectResField = getFieldArr(getFeildsFromDll(createSql)); + let data = getBindData(); + let expectResData = getResData(data, tagData1, 14).concat(getResData(data, tagData2, 14)).concat(getResData(data, tagData3, 14)); + + // prepare tag TAOS_BIND + let tagBind1 = new taos.TaosBind(14); + tagBind1.bindBool(true); + tagBind1.bindTinyInt(1); + tagBind1.bindSmallInt(32767); + tagBind1.bindInt(1234555); + tagBind1.bindBigInt(-164243520000011111n); + tagBind1.bindFloat(214.02); + tagBind1.bindDouble(2.01); + tagBind1.bindBinary('taosdata涛思数据'); + tagBind1.bindNchar('TDengine数据'); + tagBind1.bindUTinyInt(254); + tagBind1.bindUSmallInt(65534); + tagBind1.bindUInt(4294967290 / 2); + tagBind1.bindUBigInt(164243520000011111n); + + let tagBind2 = new taos.TaosBind(14); + tagBind2.bindBool(true); + tagBind2.bindTinyInt(2); + tagBind2.bindSmallInt(32767); + tagBind2.bindInt(1234555); + tagBind2.bindBigInt(-164243520000011111n); + tagBind2.bindFloat(214.02); + tagBind2.bindDouble(2.01); + tagBind2.bindBinary('taosdata涛思数据'); + tagBind2.bindNchar('TDengine数据'); + tagBind2.bindUTinyInt(254); + tagBind2.bindUSmallInt(65534); + tagBind2.bindUInt(4294967290 / 2); + tagBind2.bindUBigInt(164243520000011111n); + + let tagBind3 = new taos.TaosBind(14); + tagBind3.bindBool(true); + tagBind3.bindTinyInt(3); + tagBind3.bindSmallInt(32767); + tagBind3.bindInt(1234555); + tagBind3.bindBigInt(-164243520000011111n); + tagBind3.bindFloat(214.02); + tagBind3.bindDouble(2.01); + tagBind3.bindBinary('taosdata涛思数据'); + tagBind3.bindNchar('TDengine数据'); + tagBind3.bindUTinyInt(254); + tagBind3.bindUSmallInt(65534); + tagBind3.bindUInt(4294967290 / 2); + tagBind3.bindUBigInt(164243520000011111n); + + executeUpdate(createSql); + c1.stmtInit(); + c1.stmtPrepare(insertSql); + // ========= bind for 1st table ================= + c1.stmtSetTbnameTags(`${table}_s01`, tagBind1.getBind()); + for (let i = 0; i < data.length - 14; i += 14) { + let bind = new taos.TaosBind(14); + bind.bindTimestamp(data[i]); + bind.bindBool(data[i + 1]); + bind.bindTinyInt(data[i + 2]); + bind.bindSmallInt(data[i + 3]); + bind.bindInt(data[i + 4]); + bind.bindBigInt(data[i + 5]); + bind.bindFloat(data[i + 6]); + bind.bindDouble(data[i + 7]); + bind.bindBinary(data[i + 8]); + bind.bindNchar(data[i + 9]); + bind.bindUTinyInt(data[i + 10]); + bind.bindUSmallInt(data[i + 11]); + bind.bindUInt(data[i + 12]); + bind.bindUBigInt(data[i + 13]); + c1.stmtBindParam(bind.getBind()); + c1.stmtAddBatch(); + } + let bind2 = new taos.TaosBind(14); + bind2.bindTimestamp(data[14 * 4]); + for (let j = 0; j < 13; j++) { + bind2.bindNil(); + } + c1.stmtBindParam(bind2.getBind()); + c1.stmtAddBatch(); + // c1.stmtExecute(); + + // ========= bind for 2nd table ================= + c1.stmtSetTbnameTags(`${table}_s02`, tagBind2.getBind()); + for (let i = 0; i < data.length - 14; i += 14) { + let bind = new taos.TaosBind(14); + bind.bindTimestamp(data[i]); + bind.bindBool(data[i + 1]); + bind.bindTinyInt(data[i + 2]); + bind.bindSmallInt(data[i + 3]); + bind.bindInt(data[i + 4]); + bind.bindBigInt(data[i + 5]); + bind.bindFloat(data[i + 6]); + bind.bindDouble(data[i + 7]); + bind.bindBinary(data[i + 8]); + bind.bindNchar(data[i + 9]); + bind.bindUTinyInt(data[i + 10]); + bind.bindUSmallInt(data[i + 11]); + bind.bindUInt(data[i + 12]); + bind.bindUBigInt(data[i + 13]); + c1.stmtBindParam(bind.getBind()); + c1.stmtAddBatch(); + } + c1.stmtBindParam(bind2.getBind()); + c1.stmtAddBatch(); + // c1.stmtExecute(); + + // ========= bind for 3rd table ================= + c1.stmtSetTbnameTags(`${table}_s03`, tagBind3.getBind()); + for (let i = 0; i < data.length - 14; i += 14) { + let bind = new taos.TaosBind(14); + bind.bindTimestamp(data[i]); + bind.bindBool(data[i + 1]); + bind.bindTinyInt(data[i + 2]); + bind.bindSmallInt(data[i + 3]); + bind.bindInt(data[i + 4]); + bind.bindBigInt(data[i + 5]); + bind.bindFloat(data[i + 6]); + bind.bindDouble(data[i + 7]); + bind.bindBinary(data[i + 8]); + bind.bindNchar(data[i + 9]); + bind.bindUTinyInt(data[i + 10]); + bind.bindUSmallInt(data[i + 11]); + bind.bindUInt(data[i + 12]); + bind.bindUBigInt(data[i + 13]); + c1.stmtBindParam(bind.getBind()); + c1.stmtAddBatch(); + } + c1.stmtBindParam(bind2.getBind()); + c1.stmtAddBatch(); + c1.stmtExecute(); + c1.stmtClose(); + + let result = executeQuery(querySql); + let actualResData = result.resData; + let actualResFields = result.resFeilds; + + //assert result data length + expect(expectResData.length).toEqual(actualResData.length); + //assert result data + expectResData.forEach((item, index) => { + expect(item).toEqual(actualResData[index]); + }); + + //assert result meta data + expectResField.forEach((item, index) => { + expect(item).toEqual(actualResFields[index]) + }) + }); +}) +