comparison src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java @ 884:1956d8ba5ad3

Optimise getMetaData(). We can compute the number of result columns, so avoid to go through all metadata entries in column[] to test if it is a result column.
author Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
date Wed, 03 Apr 2024 14:35:25 +0200 (13 months ago)
parents 333bbac1e3e8
children 485c75b35cc9
comparison
equal deleted inserted replaced
883:333bbac1e3e8 884:1956d8ba5ad3
355 @Override 355 @Override
356 public ResultSetMetaData getMetaData() throws SQLException { 356 public ResultSetMetaData getMetaData() throws SQLException {
357 if (rsmd == null) { 357 if (rsmd == null) {
358 // first use, construct the arrays with metadata and a 358 // first use, construct the arrays with metadata and a
359 // ResultSetMetaData object once and reuse it for all next calls 359 // ResultSetMetaData object once and reuse it for all next calls
360 int rescolcount = 0; 360 final int rescolcount = size - paramCount;
361 for (int i = 0; i < size; i++) {
362 /* when column[i] == null it is a parameter,
363 when column[i] != null it is a result column of the prepared query */
364 if (column[i] == null)
365 continue;
366 rescolcount++;
367 }
368 int array_size = rescolcount; 361 int array_size = rescolcount;
369 if (array_size == 0) { 362 if (array_size == 0) {
370 // there are no resultset columns for this prepared statement 363 // there are no resultset columns for this prepared statement
371 // we can not create arrays of size 0, so use: 364 // we can not create arrays of size 0, so use:
372 array_size = 1; 365 array_size = 1;
378 final String[] types = new String[array_size]; 371 final String[] types = new String[array_size];
379 final int[] jdbcTypes = new int[array_size]; 372 final int[] jdbcTypes = new int[array_size];
380 final int[] lengths = new int[array_size]; 373 final int[] lengths = new int[array_size];
381 final int[] precisions = new int[array_size]; 374 final int[] precisions = new int[array_size];
382 final int[] scales = new int[array_size]; 375 final int[] scales = new int[array_size];
383 // now fill the arrays with only the resultset columns metadata 376 // fill the arrays with the resultset columns metadata
384 rescolcount = 0; 377 for (int i = 0; i < rescolcount; i++) {
385 for (int i = 0; i < size; i++) { 378 schemas[i] = schema[i];
386 /* when column[i] == null it is a parameter, 379 tables[i] = table[i];
387 when column[i] != null it is a result column of the prepared query */ 380 columns[i] = column[i];
388 if (column[i] == null) 381 types[i] = monetdbType[i];
389 continue; 382 jdbcTypes[i] = javaType[i];
390 schemas[rescolcount] = schema[i]; 383 switch (jdbcTypes[i]) {
391 tables[rescolcount] = table[i];
392 columns[rescolcount] = column[i];
393 types[rescolcount] = monetdbType[i];
394 jdbcTypes[rescolcount] = javaType[i];
395 switch (jdbcTypes[rescolcount]) {
396 case Types.BIGINT: 384 case Types.BIGINT:
397 lengths[rescolcount] = 19; 385 lengths[i] = 19;
398 break; 386 break;
399 case Types.INTEGER: 387 case Types.INTEGER:
400 lengths[rescolcount] = 10; 388 lengths[i] = 10;
401 break; 389 break;
402 case Types.SMALLINT: 390 case Types.SMALLINT:
403 lengths[rescolcount] = 5; 391 lengths[i] = 5;
404 break; 392 break;
405 case Types.TINYINT: 393 case Types.TINYINT:
406 lengths[rescolcount] = 3; 394 lengths[i] = 3;
407 break; 395 break;
408 case Types.REAL: 396 case Types.REAL:
409 lengths[rescolcount] = 7; 397 lengths[i] = 7;
410 break; 398 break;
411 case Types.FLOAT: 399 case Types.FLOAT:
412 case Types.DOUBLE: 400 case Types.DOUBLE:
413 lengths[rescolcount] = 15; 401 lengths[i] = 15;
414 break; 402 break;
415 case Types.DATE: 403 case Types.DATE:
416 lengths[rescolcount] = 10; // 2020-10-08 404 lengths[i] = 10; // 2020-10-08
417 break; 405 break;
418 case Types.TIME: 406 case Types.TIME:
419 lengths[rescolcount] = 15; // 21:51:34.399753 407 lengths[i] = 15; // 21:51:34.399753
420 break; 408 break;
421 case Types.TIME_WITH_TIMEZONE: 409 case Types.TIME_WITH_TIMEZONE:
422 lengths[rescolcount] = 21; // 21:51:34.399753+02:00 410 lengths[i] = 21; // 21:51:34.399753+02:00
423 break; 411 break;
424 case Types.TIMESTAMP: 412 case Types.TIMESTAMP:
425 lengths[rescolcount] = 26; // 2020-10-08 21:51:34.399753 413 lengths[i] = 26; // 2020-10-08 21:51:34.399753
426 break; 414 break;
427 case Types.TIMESTAMP_WITH_TIMEZONE: 415 case Types.TIMESTAMP_WITH_TIMEZONE:
428 lengths[rescolcount] = 32; // 2020-10-08 21:51:34.399753+02:00 416 lengths[i] = 32; // 2020-10-08 21:51:34.399753+02:00
429 break; 417 break;
430 case Types.BOOLEAN: 418 case Types.BOOLEAN:
431 lengths[rescolcount] = 5; // true or false 419 lengths[i] = 5; // true or false
432 break; 420 break;
433 default: 421 default:
434 lengths[rescolcount] = digits[i]; 422 lengths[i] = digits[i];
435 } 423 }
436 precisions[rescolcount] = digits[i]; 424 precisions[i] = digits[i];
437 scales[rescolcount] = scale[i]; 425 scales[i] = scale[i];
438 rescolcount++;
439 } 426 }
440 427
441 rsmd = new MonetResultSetMetaData((MonetConnection) getConnection(), rescolcount, 428 rsmd = new MonetResultSetMetaData((MonetConnection) getConnection(), rescolcount,
442 schemas, tables, columns, types, jdbcTypes, lengths, precisions, scales); 429 schemas, tables, columns, types, jdbcTypes, lengths, precisions, scales);
443 } 430 }