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

Add ExpressionColumn.rowId flag

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