[jOOQ/jOOQ#11921] Wrong position reported for parser meta lookup failures

This commit is contained in:
Lukas Eder 2021-05-27 20:48:06 +02:00
parent 76a25dc02e
commit 0b9454fe04
2 changed files with 16 additions and 12 deletions

View File

@ -64,7 +64,7 @@ final class FieldProxy<T> extends AbstractField<T> implements TableField<Record,
* The position in the parsed SQL string where this field proxy was
* encountered.
*/
private int position;
private final int position;
/**
* The scope owner that produced this field proxy.

View File

@ -10946,19 +10946,21 @@ final class DefaultParseContext extends AbstractScope implements ParseContext {
}
private final Table<?> parseTableName() {
return lookupTable(parseName());
return lookupTable(position(), parseName());
}
private final Table<?> parseTableNameIf() {
int positionBeforeName = position();
Name name = parseNameIf();
if (name == null)
return null;
return lookupTable(name);
return lookupTable(positionBeforeName, name);
}
private final Field<?> parseFieldNameOrSequenceExpression() {
int positionBeforeName = position();
Name name = parseName();
if (name.qualified()) {
@ -11008,11 +11010,11 @@ final class DefaultParseContext extends AbstractScope implements ParseContext {
return lookupField(name);
return lookupField(positionBeforeName, name);
}
private final TableField<?, ?> parseFieldName() {
return (TableField<?, ?>) lookupField(parseName());
return (TableField<?, ?>) lookupField(position, parseName());
}
private final Sequence<?> parseSequenceName() {
@ -11076,7 +11078,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext {
}
private final QualifiedAsterisk parseQualifiedAsteriskIf() {
int p = position();
int positionBeforeName = position();
Name i1 = parseIdentifierIf();
if (i1 == null)
@ -11097,13 +11099,13 @@ final class DefaultParseContext extends AbstractScope implements ParseContext {
}
else {
parse('*');
return lookupTable(result == null ? i1 : DSL.name(result.toArray(EMPTY_NAME))).asterisk();
return lookupTable(positionBeforeName, result == null ? i1 : DSL.name(result.toArray(EMPTY_NAME))).asterisk();
}
}
while (parseIf('.'));
}
position(p);
position(positionBeforeName);
return null;
}
@ -13634,7 +13636,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext {
}
}
private final Table<?> lookupTable(Name name) {
private final Table<?> lookupTable(int positionBeforeName, Name name) {
if (meta != null) {
List<Table<?>> tables;
@ -13652,19 +13654,21 @@ final class DefaultParseContext extends AbstractScope implements ParseContext {
return tables.get(0);
}
if (metaLookups() == THROW_ON_FAILURE)
if (metaLookups() == THROW_ON_FAILURE) {
position(positionBeforeName);
throw exception("Unknown table identifier");
}
return table(name);
}
private final Field<?> lookupField(Name name) {
private final Field<?> lookupField(int positionBeforeName, Name name) {
if (metaLookups() == ParseWithMetaLookups.OFF || lookupFields.scopeLevel() < 0)
return field(name);
FieldProxy<?> field = lookupFields.get(name);
if (field == null)
lookupFields.set(name, field = new FieldProxy<>((AbstractField<Object>) field(name), position));
lookupFields.set(name, field = new FieldProxy<>((AbstractField<Object>) field(name), positionBeforeName));
return field;
}