@@ -43,6 +43,7 @@ const assert = require('assert');
4343const dbConfig = require ( './dbconfig.js' ) ;
4444const assist = require ( './dataTypeAssist.js' ) ;
4545const testsUtil = require ( './testsUtil.js' ) ;
46+ const random = require ( './random.js' ) ;
4647
4748const inFileName = 'test/clobexample.txt' ; // the file with text to be inserted into the database
4849const outFileName = 'test/clobstreamout.txt' ; // output file with the stream out data
@@ -164,6 +165,89 @@ describe('40. dataTypeClob.js', function() {
164165
165166 } ) ; // 40.1.2
166167
168+ it ( '40.1.3 CLOB getData(offset, len)' , async function ( ) {
169+ const lenStr = 32768 ;
170+ const specialStr = "40.1.3" ;
171+ const largeStr = random . getRandomString ( lenStr , specialStr ) ;
172+ const multiByteStr = 'aüÅæÖÆåøübcd' ;
173+
174+ const binds = [
175+ [ 3 , largeStr ] ,
176+ [ 4 , multiByteStr ]
177+ ] ;
178+ let result = await connection . executeMany (
179+ `INSERT INTO nodb_myclobs (num, content) ` +
180+ `VALUES (:1, :2)` ,
181+ binds ,
182+ [
183+ { type : oracledb . NUMBER } ,
184+ { type : oracledb . CLOB }
185+ ] ) ;
186+ assert . strictEqual ( result . rowsAffected , 2 ) ;
187+
188+ result = await connection . execute (
189+ "SELECT content FROM nodb_myclobs WHERE num = :n" ,
190+ { n : 3 } ) ;
191+
192+ let lob = result . rows [ 0 ] [ 0 ] ;
193+ let clob = await lob . getData ( ) ;
194+ assert . strictEqual ( largeStr , clob ) ;
195+
196+ let offset = 5 ;
197+ let len = 10 ;
198+ // starting from position 4 (largeStr[4]) to 10 characters.
199+ clob = await lob . getData ( offset , len ) ;
200+ assert . strictEqual ( largeStr . slice ( offset - 1 , offset + len - 1 ) , clob ) ;
201+
202+ // len not specified gives entire data starting from offset
203+ offset = 5 ;
204+ clob = await lob . getData ( offset ) ;
205+ assert . strictEqual ( largeStr . slice ( offset - 1 ) , clob ) ;
206+
207+ // len specified as 0 gives error.
208+ offset = 5 ;
209+ len = 0 ;
210+ await assert . rejects (
211+ async ( ) => await lob . getData ( offset , len ) ,
212+ / N J S - 0 0 5 : /
213+ ) ;
214+
215+ // large number of characters starting from offset 5.
216+ offset = 5 ;
217+ len = 9999 ;
218+ clob = await lob . getData ( offset , len ) ;
219+ assert . strictEqual ( largeStr . slice ( offset - 1 , offset + len - 1 ) , clob ) ;
220+
221+ // len exceeding lob length is simply ignored and
222+ // characters till end starting from offset is returned.
223+ offset = 5 ;
224+ len = 99999 ;
225+ clob = await lob . getData ( offset , len ) ;
226+ assert . strictEqual ( largeStr . slice ( offset - 1 ) , clob ) ;
227+
228+ // Invalid ofset, we get null.
229+ offset = 99999 ;
230+ len = 10 ;
231+ clob = await lob . getData ( offset , len ) ;
232+ assert . equal ( clob , null ) ;
233+
234+ result = await connection . execute (
235+ "SELECT content FROM nodb_myclobs WHERE num = :n" ,
236+ { n : 4 } ) ;
237+
238+ lob = result . rows [ 0 ] [ 0 ] ;
239+
240+ clob = await lob . getData ( ) ;
241+ assert . strictEqual ( multiByteStr , clob ) ;
242+
243+ offset = 2 ;
244+ len = 10 ;
245+ // starting from position 1 (multiByteStr[1]) to 10 characters. "üÅæÖÆåøübc"
246+ clob = await lob . getData ( offset , len ) ;
247+ assert . strictEqual ( multiByteStr . slice ( offset - 1 , offset + len - 1 ) , clob ) ;
248+
249+ } ) ; // 40.1.3
250+
167251 } ) ; // 40.1
168252
169253 describe ( '40.2 stores null value correctly' , function ( ) {
0 commit comments