Skip to content

Commit

Permalink
feat(sql): support sql keywords as column names (questdb#1267)
Browse files Browse the repository at this point in the history
  • Loading branch information
ideoma committed Aug 27, 2021
1 parent db5ed31 commit 746babb
Show file tree
Hide file tree
Showing 8 changed files with 271 additions and 151 deletions.
12 changes: 8 additions & 4 deletions core/src/main/java/io/questdb/griffin/SqlOptimiser.java
Original file line number Diff line number Diff line change
Expand Up @@ -661,11 +661,11 @@ private ExpressionNode concatFilters(ExpressionNode old, ExpressionNode filter)
}
}

private void copyColumnsFromMetadata(QueryModel model, RecordMetadata m) throws SqlException {
private void copyColumnsFromMetadata(QueryModel model, RecordMetadata m, boolean cleanColumnNames) throws SqlException {
// column names are not allowed to have dot

for (int i = 0, k = m.getColumnCount(); i < k; i++) {
CharSequence columnName = createColumnAlias(m.getColumnName(i), model);
CharSequence columnName = createColumnAlias(m.getColumnName(i), model, cleanColumnNames);
model.addField(queryColumnPool.next().of(columnName, expressionNodePool.next().of(LITERAL, columnName, 0, 0)));
}

Expand All @@ -685,6 +685,10 @@ private void copyColumnsFromMetadata(QueryModel model, RecordMetadata m) throws
}
}

private CharSequence createColumnAlias(CharSequence name, QueryModel model, boolean cleanColumnNames) {
return SqlUtil.createColumnAlias(characterStore, name, -1, model.getAliasToColumnMap(), cleanColumnNames);
}

private CharSequence createColumnAlias(CharSequence name, QueryModel model) {
return SqlUtil.createColumnAlias(characterStore, name, -1, model.getAliasToColumnMap());
}
Expand Down Expand Up @@ -1835,7 +1839,7 @@ private void openReaderAndEnumerateColumns(SqlExecutionContext executionContext,
)) {
model.setTableVersion(r.getVersion());
model.setTableId(r.getMetadata().getId());
copyColumnsFromMetadata(model, r.getMetadata());
copyColumnsFromMetadata(model, r.getMetadata(), false);
} catch (EntryLockedException e) {
throw SqlException.position(tableNamePosition).put("table is locked: ").put(tableLookupSequence);
} catch (CairoException e) {
Expand Down Expand Up @@ -2131,7 +2135,7 @@ private void parseFunctionAndEnumerateColumns(@NotNull QueryModel model, @NotNul
}
model.setTableNameFunction(function);
functionsInFlight.add(function);
copyColumnsFromMetadata(model, function.getRecordCursorFactory().getMetadata());
copyColumnsFromMetadata(model, function.getRecordCursorFactory().getMetadata(), true);
}

private void processEmittedJoinClauses(QueryModel model) {
Expand Down
3 changes: 2 additions & 1 deletion core/src/main/java/io/questdb/griffin/SqlParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,8 @@ private CharSequence createColumnAlias(ExpressionNode node, QueryModel model) {
characterStore,
GenericLexer.unquote(node.token),
Chars.indexOf(node.token, '.'),
model.getAliasToColumnMap()
model.getAliasToColumnMap(),
node.type != ExpressionNode.LITERAL
);
}

Expand Down
12 changes: 11 additions & 1 deletion core/src/main/java/io/questdb/griffin/SqlUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,17 @@ static CharSequence createColumnAlias(
int indexOfDot,
LowerCaseCharSequenceObjHashMap<QueryColumn> aliasToColumnMap
) {
final boolean disallowed = disallowedAliases.contains(base);
return createColumnAlias(store, base, indexOfDot, aliasToColumnMap, false);
}

static CharSequence createColumnAlias(
CharacterStore store,
CharSequence base,
int indexOfDot,
LowerCaseCharSequenceObjHashMap<QueryColumn> aliasToColumnMap,
boolean cleanColumnNames
) {
final boolean disallowed = cleanColumnNames && disallowedAliases.contains(base);

// short and sweet version
if (indexOfDot == -1 && !disallowed && aliasToColumnMap.excludes(base)) {
Expand Down
Loading

0 comments on commit 746babb

Please sign in to comment.