34
34
const oracledb = require ( 'oracledb' ) ;
35
35
const assert = require ( 'assert' ) ;
36
36
const dbConfig = require ( './dbconfig.js' ) ;
37
+ const testsUtil = require ( './testsUtil.js' ) ;
38
+ const random = require ( './random.js' ) ;
37
39
38
40
describe ( '9. columnMetadata.js' , function ( ) {
39
41
@@ -217,6 +219,11 @@ describe('9. columnMetadata.js', function() {
217
219
} ) ; // 9.2
218
220
219
221
describe ( '9.3 Large number of columns' , function ( ) {
222
+ let columns_string ;
223
+ const tableName = "nodb_large_columns" ;
224
+ const sqlSelect = "SELECT * FROM " + tableName ;
225
+ const sqlDrop = testsUtil . sqlDropTable ( tableName ) ;
226
+
220
227
function genColumns ( size , dbType ) {
221
228
const buffer = [ ] ;
222
229
for ( var i = 0 ; i < size ; i ++ ) {
@@ -225,35 +232,23 @@ describe('9. columnMetadata.js', function() {
225
232
return buffer . join ( ) ;
226
233
}
227
234
235
+ function generateCreateSql ( cols ) {
236
+ return `create table ${ tableName } (${ cols } )` ;
237
+ }
238
+
239
+ after ( async function ( ) {
240
+ oracledb . fetchAsString = [ ] ;
241
+ await connection . execute ( sqlDrop ) ;
242
+ } ) ;
243
+
228
244
it ( '9.10 works with a large number of columns' , async function ( ) {
229
245
const column_size = 300 ;
230
- let columns_string = genColumns ( column_size , " NUMBER" ) ;
231
- const table_name = "nodb_large_columns" ;
232
- const sqlSelect = "SELECT * FROM " + table_name ;
233
- const sqlDrop = "DROP TABLE " + table_name + " PURGE" ;
246
+ columns_string = genColumns ( column_size , " NUMBER" ) ;
234
247
235
- function generateProcedure ( ) {
236
- return "BEGIN \n" +
237
- " DECLARE \n" +
238
- " e_table_missing EXCEPTION; \n" +
239
- " PRAGMA EXCEPTION_INIT(e_table_missing, -00942);\n " +
240
- " BEGIN \n" +
241
- " EXECUTE IMMEDIATE ('DROP TABLE nodb_large_columns PURGE'); \n" +
242
- " EXCEPTION \n" +
243
- " WHEN e_table_missing \n" +
244
- " THEN NULL; \n" +
245
- " END; \n" +
246
- " EXECUTE IMMEDIATE (' \n" +
247
- " CREATE TABLE nodb_large_columns ( \n" +
248
- columns_string +
249
- " ) \n" +
250
- " '); \n" +
251
- "END; " ;
252
- }
248
+ let plsql = testsUtil . sqlCreateTable ( tableName , generateCreateSql ( columns_string ) ) ;
249
+ await connection . execute ( plsql ) ;
253
250
254
251
// check NUMBER type column
255
- await connection . execute ( generateProcedure ( ) ) ;
256
-
257
252
// Dont cache statment as we re-run with different
258
253
// column type with same table.
259
254
let result = await connection . execute ( sqlSelect , [ ] ,
@@ -265,11 +260,65 @@ describe('9. columnMetadata.js', function() {
265
260
266
261
// check CLOB type (GH Issue 1642)
267
262
columns_string = genColumns ( column_size , " CLOB" ) ;
268
- await connection . execute ( generateProcedure ( ) ) ;
263
+ plsql = testsUtil . sqlCreateTable ( tableName , generateCreateSql ( columns_string ) ) ;
264
+ await connection . execute ( plsql ) ;
265
+ result = await connection . execute ( sqlSelect , [ ] , { keepInStmtCache : false } ) ;
266
+ for ( let i = 0 ; i < column_size ; i ++ ) {
267
+ assert . strictEqual ( result . metaData [ i ] . name , 'COLUMN_' + i ) ;
268
+ }
269
+ await connection . execute ( sqlDrop ) ;
270
+ } ) ;
271
+
272
+ it ( '9.11 works with re-executes with multiple packet response' , async function ( ) {
273
+ const column_size = 50 ;
274
+ const numRows = 5 ;
275
+ oracledb . fetchAsString = [ oracledb . CLOB ] ;
276
+
277
+ // read table meta data (GH Issue 1684) without inserting any row.
278
+ columns_string = genColumns ( column_size , " CLOB" ) ;
279
+ const plsql = testsUtil . sqlCreateTable ( tableName , generateCreateSql ( columns_string ) ) ;
280
+ await connection . execute ( plsql ) ;
281
+ let result = await connection . execute ( sqlSelect ) ;
282
+ for ( let i = 0 ; i < column_size ; i ++ ) {
283
+ assert . strictEqual ( result . metaData [ i ] . name , 'COLUMN_' + i ) ;
284
+ }
285
+
286
+ // Insert rows.
287
+ const len = 5 * 1024 ;
288
+ const specialStr = "9.11" ;
289
+ const clobStr = random . getRandomString ( len , specialStr ) ;
290
+ let bindNames = ':clob,' ;
291
+ bindNames = bindNames . repeat ( column_size - 1 ) ;
292
+ bindNames = bindNames + ':clob' ;
293
+ const binds = new Array ( numRows ) ;
294
+ const values = new Array ( column_size ) ;
295
+ values . fill ( clobStr , 0 , column_size ) ;
296
+ binds . fill ( values , 0 , numRows ) ;
297
+ const sql = `INSERT INTO nodb_large_columns VALUES (${ bindNames } )` ;
298
+ result = await connection . executeMany ( sql , binds ) ;
299
+
300
+ // Issue second select with rows in table.
301
+ result = await connection . execute ( sqlSelect ) ;
302
+ for ( let i = 0 ; i < column_size ; i ++ ) {
303
+ assert . strictEqual ( result . metaData [ i ] . name , 'COLUMN_' + i ) ;
304
+ }
305
+ for ( let i = 0 ; i < result . rows . length ; i ++ ) {
306
+ for ( let j = 0 ; j < column_size ; j ++ ) {
307
+ assert . strictEqual ( result . rows [ i ] [ j ] , clobStr ) ;
308
+ }
309
+ }
310
+
311
+ // subsequent selects should also work fine.
269
312
result = await connection . execute ( sqlSelect ) ;
270
313
for ( let i = 0 ; i < column_size ; i ++ ) {
271
314
assert . strictEqual ( result . metaData [ i ] . name , 'COLUMN_' + i ) ;
272
315
}
316
+ for ( let i = 0 ; i < result . rows . length ; i ++ ) {
317
+ for ( let j = 0 ; j < column_size ; j ++ ) {
318
+ assert . strictEqual ( result . rows [ i ] [ j ] , clobStr ) ;
319
+ }
320
+ }
321
+
273
322
await connection . execute ( sqlDrop ) ;
274
323
} ) ;
275
324
} ) ; // 9.3
0 commit comments