ibmdb / node-ibm_db

IBM DB2 and IBM Informix bindings for node
MIT License
188 stars 151 forks source link

Data Lost at position 1022 when retrieving from DBCLOB. #858

Closed markddrake closed 2 years ago

markddrake commented 2 years ago

Running the following code

import ibmdb  from 'ibm_db'
import crypto from 'crypto';
import assert from 'assert';

async function main() { 
    const cn = "DATABASE=SAMPLE;HOSTNAME=yadamu-db2;PORT=50000;PROTOCOL=TCPIP;UID=DB2INST1;PWD=oracle;"
    const BLOB_LENGTH = 1024 * 16;

    const conn = await ibmdb.open(cn)
    let results 

    results = await conn.query(`BEGIN DECLARE V_STATEMENT VARCHAR(300) DEFAULT 'drop table DBCLOB_TAB'; DECLARE CONTINUE HANDLER FOR SQLSTATE '42704' BEGIN  END;  EXECUTE IMMEDIATE V_STATEMENT; END;`)
    console.log(results)

    results = await conn.querySync(`create table DBCLOB_TAB (id int, B1 DBCLOB(${BLOB_LENGTH}))`);
    console.log(results)

    const filler = 'X'.repeat(1000)

    const source = {
     "V1" : filler
   ,  "V2" : "Oops"
   }

   const data = JSON.stringify(source," ",2);

   console.log(data.length,Buffer.byteLength(data))

    try {
      results = await conn.query(`insert into DBCLOB_TAB (ID, B1) values (?, ?)`,[1,data]);
      console.log(results)
    } catch (e) {
      console.log(1,e)
    }

    results = await conn.query(`select ID, length(B1) L1, B1 from DBCLOB_TAB`)
    console.log(results)

    let target
    try {
      target = JSON.parse(results[0].B1)
      console.log(source.V1.length,target.V1.length)
    } catch (e) {
      console.log('Oops',e)
    }

    for (var i = 0; i < data.length; i++) {
      if (data.charAt(i) !== results[0].B1.charAt(i)) {
        console.log(i,data.charAt(i), results[0].B1.charAt(i))
        break
      }
    }

}

main().then(() => { console.log('success')}).catch((e) => { console.log(e) })

results in

C:\Development\YADAMU>node src\scratch\db2\DBCLOB.js
[]
[]
1030 1030
[]
[
  {
    ID: 1,
    L1: 1030,
    B1: '{\n' +
      '  "V1": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",\n' +
      '  "V2": Oops"\n' +
      '}'
  }
]
Oops SyntaxError: Unexpected token O in JSON at position 1022
    at JSON.parse (<anonymous>)
    at main (file:///C:/Development/YADAMU/src/scratch/db2/DBCLOB.js:42:21)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
1022 " O
success

It appears that a character has been lost at character 1022 when retrieving the value from the database. The content in the database appears to be correct.