提交 d924094c authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Add ExpressionColumn.rowId flag

上级 b4fd4d5f
...@@ -1166,40 +1166,53 @@ public class Parser { ...@@ -1166,40 +1166,53 @@ public class Parser {
} }
private Column readTableColumn(TableFilter filter) { private Column readTableColumn(TableFilter filter) {
String columnName = readColumnIdentifier(); boolean rowId = false;
if (readIf(DOT)) { String columnName = null;
String tableAlias = columnName; if (currentTokenType == _ROWID_ && database.getSettings().rowId) {
read();
rowId = true;
} else {
columnName = readColumnIdentifier(); columnName = readColumnIdentifier();
if (readIf(DOT)) { if (readIf(DOT)) {
String schema = tableAlias; String tableAlias = columnName;
tableAlias = columnName; if (currentTokenType == _ROWID_ && database.getSettings().rowId) {
columnName = readColumnIdentifier(); read();
if (readIf(DOT)) { rowId = true;
String catalogName = schema; } else {
schema = tableAlias;
tableAlias = columnName;
columnName = readColumnIdentifier(); columnName = readColumnIdentifier();
if (!equalsToken(catalogName, database.getShortName())) { if (readIf(DOT)) {
throw DbException.get(ErrorCode.DATABASE_NOT_FOUND_1, String schema = tableAlias;
catalogName); tableAlias = columnName;
if (currentTokenType == _ROWID_ && database.getSettings().rowId) {
read();
rowId = true;
} else {
columnName = readColumnIdentifier();
if (readIf(DOT)) {
if (!equalsToken(schema, database.getShortName())) {
throw DbException.get(ErrorCode.DATABASE_NOT_FOUND_1, schema);
}
schema = tableAlias;
tableAlias = columnName;
if (currentTokenType == _ROWID_ && database.getSettings().rowId) {
read();
rowId = true;
} else {
columnName = readColumnIdentifier();
}
}
}
if (!equalsToken(schema, filter.getTable().getSchema().getName())) {
throw DbException.get(ErrorCode.SCHEMA_NOT_FOUND_1, schema);
}
} }
} }
if (!equalsToken(schema, filter.getTable().getSchema() if (!equalsToken(tableAlias, filter.getTableAlias())) {
.getName())) { throw DbException.get(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1, tableAlias);
throw DbException.get(ErrorCode.SCHEMA_NOT_FOUND_1, schema);
} }
} }
if (!equalsToken(tableAlias, filter.getTableAlias())) {
throw DbException.get(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1,
tableAlias);
}
}
if (database.getSettings().rowId) {
if (Column.ROWID.equals(columnName)) {
return filter.getRowIdColumn();
}
} }
return filter.getTable().getColumn(columnName); return rowId ? filter.getRowIdColumn() : filter.getTable().getColumn(columnName);
} }
private Update parseUpdate() { private Update parseUpdate() {
...@@ -1359,11 +1372,11 @@ public class Parser { ...@@ -1359,11 +1372,11 @@ public class Parser {
} }
private Column parseColumn(Table table) { private Column parseColumn(Table table) {
String id = readColumnIdentifier(); if (currentTokenType == _ROWID_ && database.getSettings().rowId) {
if (database.getSettings().rowId && Column.ROWID.equals(id)) { read();
return table.getRowIdColumn(); return table.getRowIdColumn();
} }
return table.getColumn(id); return table.getColumn(readColumnIdentifier());
} }
/** /**
...@@ -1389,7 +1402,7 @@ public class Parser { ...@@ -1389,7 +1402,7 @@ public class Parser {
.resolveTableOrView(session, database.sysIdentifier("HELP")); .resolveTableOrView(session, database.sysIdentifier("HELP"));
Function function = Function.getFunction(database, "UPPER"); Function function = Function.getFunction(database, "UPPER");
function.setParameter(0, new ExpressionColumn(database, informationSchema, function.setParameter(0, new ExpressionColumn(database, informationSchema,
database.sysIdentifier("HELP"), database.sysIdentifier("TOPIC"))); database.sysIdentifier("HELP"), database.sysIdentifier("TOPIC"), false));
function.doneWithParameters(); function.doneWithParameters();
TableFilter filter = new TableFilter(session, table, null, rightsChecked, select, 0, null); TableFilter filter = new TableFilter(session, table, null, rightsChecked, select, 0, null);
select.addTableFilter(filter, true); select.addTableFilter(filter, true);
...@@ -2314,10 +2327,10 @@ public class Parser { ...@@ -2314,10 +2327,10 @@ public class Parser {
join.addNaturalJoinColumn(c); join.addNaturalJoinColumn(c);
Expression tableExpr = new ExpressionColumn( Expression tableExpr = new ExpressionColumn(
database, tableSchema, database, tableSchema,
last.getTableAlias(), tableColumnName); last.getTableAlias(), tableColumnName, false);
Expression joinExpr = new ExpressionColumn( Expression joinExpr = new ExpressionColumn(
database, joinSchema, join.getTableAlias(), database, joinSchema, join.getTableAlias(),
joinColumnName); joinColumnName, false);
Expression equal = new Comparison(session, Expression equal = new Comparison(session,
Comparison.EQUAL, tableExpr, joinExpr); Comparison.EQUAL, tableExpr, joinExpr);
if (on == null) { if (on == null) {
...@@ -3799,7 +3812,7 @@ public class Parser { ...@@ -3799,7 +3812,7 @@ public class Parser {
} }
} }
} }
exceptColumns.add(new ExpressionColumn(database, s, t, name)); exceptColumns.add(new ExpressionColumn(database, s, t, name, false));
} while (readIfMore(true)); } while (readIfMore(true));
wildcard.setExceptColumns(exceptColumns); wildcard.setExceptColumns(exceptColumns);
} }
...@@ -3812,7 +3825,7 @@ public class Parser { ...@@ -3812,7 +3825,7 @@ public class Parser {
return expr; return expr;
} }
if (readIf(_ROWID_)) { if (readIf(_ROWID_)) {
return new ExpressionColumn(database, null, objectName, Column.ROWID); return new ExpressionColumn(database, null, objectName, Column.ROWID, true);
} }
String name = readColumnIdentifier(); String name = readColumnIdentifier();
Schema s = database.findSchema(objectName); Schema s = database.findSchema(objectName);
...@@ -3826,7 +3839,7 @@ public class Parser { ...@@ -3826,7 +3839,7 @@ public class Parser {
return expr; return expr;
} }
if (readIf(_ROWID_)) { if (readIf(_ROWID_)) {
return new ExpressionColumn(database, schema, objectName, Column.ROWID); return new ExpressionColumn(database, schema, objectName, Column.ROWID, true);
} }
name = readColumnIdentifier(); name = readColumnIdentifier();
if (readIf(OPEN_PAREN)) { if (readIf(OPEN_PAREN)) {
...@@ -3850,11 +3863,11 @@ public class Parser { ...@@ -3850,11 +3863,11 @@ public class Parser {
return expr; return expr;
} }
name = readColumnIdentifier(); name = readColumnIdentifier();
return new ExpressionColumn(database, schema, objectName, name); return new ExpressionColumn(database, schema, objectName, name, false);
} }
return new ExpressionColumn(database, schema, objectName, name); return new ExpressionColumn(database, schema, objectName, name, false);
} }
return new ExpressionColumn(database, null, objectName, name); return new ExpressionColumn(database, null, objectName, name, false);
} }
private Parameter readParameter() { private Parameter readParameter() {
...@@ -3947,7 +3960,7 @@ public class Parser { ...@@ -3947,7 +3960,7 @@ public class Parser {
} else if (readIf(DOT)) { } else if (readIf(DOT)) {
r = readTermObjectDot(name); r = readTermObjectDot(name);
} else { } else {
r = new ExpressionColumn(database, null, null, name); r = new ExpressionColumn(database, null, null, name, false);
} }
} else { } else {
read(); read();
...@@ -4061,7 +4074,7 @@ public class Parser { ...@@ -4061,7 +4074,7 @@ public class Parser {
break; break;
case _ROWID_: case _ROWID_:
read(); read();
r = new ExpressionColumn(database, null, null, Column.ROWID); r = new ExpressionColumn(database, null, null, Column.ROWID, true);
break; break;
case VALUE: case VALUE:
r = ValueExpression.get(currentValue); r = ValueExpression.get(currentValue);
...@@ -4254,7 +4267,7 @@ public class Parser { ...@@ -4254,7 +4267,7 @@ public class Parser {
} }
break; break;
} }
return new ExpressionColumn(database, null, null, name); return new ExpressionColumn(database, null, null, name, false);
} }
private Expression readInterval() { private Expression readInterval() {
...@@ -4331,7 +4344,7 @@ public class Parser { ...@@ -4331,7 +4344,7 @@ public class Parser {
return readFunctionWithoutParameters("CURRENT_DATE"); return readFunctionWithoutParameters("CURRENT_DATE");
} }
// No match, parse CURRENT as a column // No match, parse CURRENT as a column
return new ExpressionColumn(database, null, null, name); return new ExpressionColumn(database, null, null, name, false);
} }
private Expression readCase() { private Expression readCase() {
......
...@@ -459,7 +459,7 @@ public class Insert extends CommandWithValues implements ResultTarget { ...@@ -459,7 +459,7 @@ public class Insert extends CommandWithValues implements ResultTarget {
for (Column column : indexedColumns) { for (Column column : indexedColumns) {
ExpressionColumn expr = new ExpressionColumn(session.getDatabase(), ExpressionColumn expr = new ExpressionColumn(session.getDatabase(),
table.getSchema().getName(), table.getName(), table.getSchema().getName(), table.getName(),
column.getName()); column.getName(), false);
for (int i = 0; i < columns.length; i++) { for (int i = 0; i < columns.length; i++) {
if (expr.getColumnName().equals(columns[i].getName())) { if (expr.getColumnName().equals(columns[i].getName())) {
if (condition == null) { if (condition == null) {
......
...@@ -23,6 +23,7 @@ import org.h2.message.DbException; ...@@ -23,6 +23,7 @@ import org.h2.message.DbException;
import org.h2.result.ResultInterface; import org.h2.result.ResultInterface;
import org.h2.result.Row; import org.h2.result.Row;
import org.h2.result.RowImpl; import org.h2.result.RowImpl;
import org.h2.table.Column;
import org.h2.table.Table; import org.h2.table.Table;
import org.h2.table.TableFilter; import org.h2.table.TableFilter;
import org.h2.util.Utils; import org.h2.util.Utils;
...@@ -422,7 +423,7 @@ public class MergeUsing extends Prepared { ...@@ -422,7 +423,7 @@ public class MergeUsing extends Prepared {
targetMatchQuery = new Select(session, null); targetMatchQuery = new Select(session, null);
ArrayList<Expression> expressions = new ArrayList<>(1); ArrayList<Expression> expressions = new ArrayList<>(1);
expressions.add(new ExpressionColumn(session.getDatabase(), targetTable.getSchema().getName(), expressions.add(new ExpressionColumn(session.getDatabase(), targetTable.getSchema().getName(),
targetTableFilter.getTableAlias(), "_ROWID_")); targetTableFilter.getTableAlias(), Column.ROWID, true));
targetMatchQuery.setExpressions(expressions); targetMatchQuery.setExpressions(expressions);
targetMatchQuery.addTableFilter(targetTableFilter, true); targetMatchQuery.addTableFilter(targetTableFilter, true);
targetMatchQuery.addCondition(onCondition); targetMatchQuery.addCondition(onCondition);
......
...@@ -1049,7 +1049,7 @@ public class Select extends Query { ...@@ -1049,7 +1049,7 @@ public class Select extends Query {
} }
String name = filter.getDerivedColumnName(c); String name = filter.getDerivedColumnName(c);
ExpressionColumn ec = new ExpressionColumn( ExpressionColumn ec = new ExpressionColumn(
session.getDatabase(), null, alias, name != null ? name : c.getName()); session.getDatabase(), null, alias, name != null ? name : c.getName(), false);
expressions.add(index++, ec); expressions.add(index++, ec);
} }
return index; return index;
......
...@@ -36,6 +36,7 @@ public class ExpressionColumn extends Expression { ...@@ -36,6 +36,7 @@ public class ExpressionColumn extends Expression {
private final String schemaName; private final String schemaName;
private final String tableAlias; private final String tableAlias;
private final String columnName; private final String columnName;
private final boolean rowId;
private ColumnResolver columnResolver; private ColumnResolver columnResolver;
private int queryLevel; private int queryLevel;
private Column column; private Column column;
...@@ -47,14 +48,16 @@ public class ExpressionColumn extends Expression { ...@@ -47,14 +48,16 @@ public class ExpressionColumn extends Expression {
this.schemaName = null; this.schemaName = null;
this.tableAlias = null; this.tableAlias = null;
this.columnName = null; this.columnName = null;
this.rowId = column.isRowId();
} }
public ExpressionColumn(Database database, String schemaName, public ExpressionColumn(Database database, String schemaName,
String tableAlias, String columnName) { String tableAlias, String columnName, boolean rowId) {
this.database = database; this.database = database;
this.schemaName = schemaName; this.schemaName = schemaName;
this.tableAlias = tableAlias; this.tableAlias = tableAlias;
this.columnName = columnName; this.columnName = columnName;
this.rowId = rowId;
} }
@Override @Override
...@@ -71,6 +74,8 @@ public class ExpressionColumn extends Expression { ...@@ -71,6 +74,8 @@ public class ExpressionColumn extends Expression {
} else { } else {
column.getSQL(builder); column.getSQL(builder);
} }
} else if (rowId) {
builder.append(columnName);
} else { } else {
Parser.quoteIdentifier(builder, columnName); Parser.quoteIdentifier(builder, columnName);
} }
...@@ -91,6 +96,13 @@ public class ExpressionColumn extends Expression { ...@@ -91,6 +96,13 @@ public class ExpressionColumn extends Expression {
schemaName, resolver.getSchemaName())) { schemaName, resolver.getSchemaName())) {
return; return;
} }
if (rowId) {
Column col = resolver.getRowIdColumn();
if (col != null) {
mapColumn(resolver, col, level);
}
return;
}
for (Column col : resolver.getColumns()) { for (Column col : resolver.getColumns()) {
String n = resolver.getDerivedColumnName(col); String n = resolver.getDerivedColumnName(col);
boolean derived; boolean derived;
...@@ -108,13 +120,6 @@ public class ExpressionColumn extends Expression { ...@@ -108,13 +120,6 @@ public class ExpressionColumn extends Expression {
return; return;
} }
} }
if (database.equalsIdentifiers(Column.ROWID, columnName)) {
Column col = resolver.getRowIdColumn();
if (col != null) {
mapColumn(resolver, col, level);
return;
}
}
Column[] columns = resolver.getSystemColumns(); Column[] columns = resolver.getSystemColumns();
for (int i = 0; columns != null && i < columns.length; i++) { for (int i = 0; columns != null && i < columns.length; i++) {
Column col = columns[i]; Column col = columns[i];
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论