Mercurial > hg > monetdb-java
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 } |