Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FMWK-269 Fix column validation in AerospikeResultSetMetaData #42

Merged
merged 1 commit into from
Dec 2, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.aerospike.jdbc.sql;

import com.aerospike.client.Value;
import com.aerospike.jdbc.model.DataColumn;
import com.aerospike.jdbc.util.SqlLiterals;

import java.sql.ResultSetMetaData;
import java.sql.SQLDataException;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Collections;
Expand All @@ -13,6 +14,7 @@
import java.util.logging.Logger;
import java.util.stream.Stream;

import static com.aerospike.jdbc.util.SqlLiterals.sqlToJavaTypes;
import static com.aerospike.jdbc.util.SqlLiterals.sqlTypeNames;

public class AerospikeResultSetMetaData implements ResultSetMetaData, SimpleWrapper {
Expand Down Expand Up @@ -51,10 +53,14 @@ public class AerospikeResultSetMetaData implements ResultSetMetaData, SimpleWrap
precisionByType.put(Types.ARRAY, MAX_BLOCK_SIZE);
precisionByType.put(Types.BLOB, MAX_BLOCK_SIZE);
precisionByType.put(Types.CLOB, MAX_BLOCK_SIZE);
precisionByType.put(Types.REF, 0); //??
precisionByType.put(Types.DATALINK, 0); //??
precisionByType.put(Types.BOOLEAN, 8); // boolean is stored as a number, e.g. long, i.e. occupies 8 bytes
precisionByType.put(Types.ROWID, 0); //??
precisionByType.put(Types.REF, 0); // ??
precisionByType.put(Types.DATALINK, 0); // ??
if (Value.UseBoolBin) {
precisionByType.put(Types.BOOLEAN, 1);
} else {
precisionByType.put(Types.BOOLEAN, 8);
}
precisionByType.put(Types.ROWID, 0); // ??
precisionByType.put(Types.NCHAR, 2);
precisionByType.put(Types.NVARCHAR, MAX_BLOCK_SIZE);
precisionByType.put(Types.LONGNVARCHAR, MAX_BLOCK_SIZE);
Expand Down Expand Up @@ -101,7 +107,7 @@ public boolean isCaseSensitive(int column) {

@Override
public boolean isSearchable(int column) {
return true; // All fields in Aerospike are searchable either using secondary index or predicate
return true;
}

@Override
Expand All @@ -111,7 +117,7 @@ public boolean isCurrency(int column) {

@Override
public int isNullable(int column) {
return columnNullable; // any column in aerospike is nullable
return columnNullable; // any column in Aerospike is nullable
}

@Override
Expand All @@ -125,26 +131,25 @@ public int getColumnDisplaySize(int column) {
}

@Override
public String getColumnLabel(int column) {
public String getColumnLabel(int column) throws SQLException {
return getColumnName(column);
}

@Override
public String getColumnName(int column) {
public String getColumnName(int column) throws SQLException {
logger.fine(() -> "getColumnName: " + column);
validateColumn(column);
return columns.get(column - 1).getName();
}

@Override
public String getSchemaName(int column) throws SQLException {
if (columns.isEmpty()) {
throw new SQLException("invalidColumnIndex: " + column);
}
validateColumn(column);
return schema;
}

@Override
public int getPrecision(int column) {
public int getPrecision(int column) throws SQLException {
return precisionByType.getOrDefault(getColumnType(column), 0);
}

Expand All @@ -155,27 +160,23 @@ public int getScale(int column) {

@Override
public String getTableName(int column) throws SQLException {
if (columns.isEmpty()) {
throw new SQLException("invalidColumnIndex: " + column);
}
validateColumn(column);
return table;
}

@Override
public String getCatalogName(int column) throws SQLException {
if (columns.isEmpty()) {
throw new SQLException("invalidColumnIndex: " + column);
}
return schema; // return schema
return getSchemaName(column); // return schema
}

@Override
public int getColumnType(int column) {
public int getColumnType(int column) throws SQLException {
validateColumn(column);
return columns.get(column - 1).getType();
}

@Override
public String getColumnTypeName(int column) {
public String getColumnTypeName(int column) throws SQLException {
return sqlTypeNames.get(getColumnType(column));
}

Expand All @@ -195,7 +196,13 @@ public boolean isDefinitelyWritable(int column) {
}

@Override
public String getColumnClassName(int column) {
return SqlLiterals.sqlToJavaTypes.get(getColumnType(column)).getName();
public String getColumnClassName(int column) throws SQLException {
return sqlToJavaTypes.get(getColumnType(column)).getName();
}

private void validateColumn(int column) throws SQLException {
if (columns.size() < column) {
throw new SQLDataException(String.format("Column %d is out of range", column));
}
}
}
Loading