diff --git a/java/client/src/main/java/io/vitess/client/cursor/FieldMap.java b/java/client/src/main/java/io/vitess/client/cursor/FieldMap.java index 454f99a21a3..7405084d1ab 100644 --- a/java/client/src/main/java/io/vitess/client/cursor/FieldMap.java +++ b/java/client/src/main/java/io/vitess/client/cursor/FieldMap.java @@ -37,20 +37,39 @@ */ public class FieldMap { private final List fields; - private final Map indexMap; + private final Map labelMap; + private final Map nameMap; + private final Map fullNameMap; public FieldMap(Iterable fields) { this.fields = ImmutableList.copyOf(checkNotNull(fields)); - indexMap = new CaseInsensitiveMap(); + labelMap = new CaseInsensitiveMap(); + nameMap = new CaseInsensitiveMap(); + fullNameMap = new CaseInsensitiveMap(); // columnIndex is 1-based. int columnIndex = 1; for (Field field : this.fields) { - String columnLabel = field.getName(); // If multiple columns have the same name, // prefer the earlier one as JDBC ResultSet does. - if (!indexMap.containsKey(columnLabel)) { - indexMap.put(columnLabel, columnIndex); + String columnLabel = field.getName(); + if (!labelMap.containsKey(columnLabel)) { + labelMap.put(columnLabel, columnIndex); + } + String origName = field.getOrgName(); + if (origName != null && !"".equals(origName) && !nameMap.containsKey(origName)) { + nameMap.put(origName, columnIndex); + } + String tableName = field.getTable(); + if (tableName != null && !"".equals(tableName)) { + StringBuilder fullNameBuf = new StringBuilder(); + fullNameBuf.append(tableName); + fullNameBuf.append('.'); + fullNameBuf.append(field.getName()); + String fullName = fullNameBuf.toString(); + if (!fullNameMap.containsKey(fullName)) { + fullNameMap.put(fullName, columnIndex); + } } ++columnIndex; } @@ -81,6 +100,13 @@ public Field get(int columnIndex) { */ @Nullable public Integer getIndex(String columnLabel) { - return indexMap.get(columnLabel); + Integer index = labelMap.get(columnLabel); + if (index == null) { + index = nameMap.get(columnLabel); + } + if (index == null) { + index = fullNameMap.get(columnLabel); + } + return index; } } diff --git a/java/client/src/test/java/io/vitess/client/cursor/CursorTest.java b/java/client/src/test/java/io/vitess/client/cursor/CursorTest.java index b44d0556ee3..6374981fe32 100644 --- a/java/client/src/test/java/io/vitess/client/cursor/CursorTest.java +++ b/java/client/src/test/java/io/vitess/client/cursor/CursorTest.java @@ -19,6 +19,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Date; +import java.sql.SQLDataException; import java.sql.Time; import java.sql.Timestamp; import java.util.Arrays; @@ -56,6 +57,26 @@ public void testFindColumn() throws Exception { } } + @Test + public void testFindColumnAlternateIndexes() throws Exception { + try (Cursor cursor = new SimpleCursor( + QueryResult.newBuilder().addFields(Field.newBuilder().setName("col1").setTable("Table1").build()) + .addFields(Field.newBuilder().setName("myAlias").setOrgName("boringColName").setTable("Table2").build()) + .build())) { + Assert.assertEquals(1, cursor.findColumn("Table1.col1")); + Assert.assertEquals(1, cursor.findColumn("Table1.Col1")); + Assert.assertEquals(2, cursor.findColumn("myAlias")); + Assert.assertEquals(2, cursor.findColumn("Table2.myAlias")); + Assert.assertEquals(2, cursor.findColumn("boringColName")); + try { + int idx = cursor.findColumn("Table2.boringColName"); // don't do what mysql-connector-j doesn't do + Assert.fail("no exception thrown for findColumn(\"Table2.boringColName\")"); + } catch (Exception ex) { + Assert.assertEquals(SQLDataException.class, ex.getClass()); + } + } + } + @Test public void testGetInt() throws Exception { List types = Arrays.asList(Query.Type.INT8, Query.Type.UINT8, Query.Type.INT16,