
com.questdb.griffin.SqlUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of questdb-core Show documentation
Show all versions of questdb-core Show documentation
QuestDB is High Performance Time Series Database
The newest version!
/*******************************************************************************
* ___ _ ____ ____
* / _ \ _ _ ___ ___| |_| _ \| __ )
* | | | | | | |/ _ \/ __| __| | | | _ \
* | |_| | |_| | __/\__ \ |_| |_| | |_) |
* \__\_\\__,_|\___||___/\__|____/|____/
*
* Copyright (C) 2014-2019 Appsicle
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
******************************************************************************/
package com.questdb.griffin;
import com.questdb.griffin.model.ExpressionNode;
import com.questdb.griffin.model.QueryColumn;
import com.questdb.std.*;
public class SqlUtil {
static final CharSequenceHashSet disallowedAliases = new CharSequenceHashSet();
static {
for (int i = 0, n = OperatorExpression.operators.size(); i < n; i++) {
SqlUtil.disallowedAliases.add(OperatorExpression.operators.getQuick(i).token);
}
}
public static CharSequence fetchNext(GenericLexer lexer) {
int blockCount = 0;
boolean lineComment = false;
while (lexer.hasNext()) {
CharSequence cs = lexer.next();
if (lineComment) {
if (Chars.equals(cs, '\n') || Chars.equals(cs, '\r')) {
lineComment = false;
}
continue;
}
if (Chars.equals("--", cs)) {
lineComment = true;
continue;
}
if (Chars.equals("/*", cs)) {
blockCount++;
continue;
}
if (Chars.equals("*/", cs) && blockCount > 0) {
blockCount--;
continue;
}
if (blockCount == 0 && GenericLexer.WHITESPACE.excludes(cs)) {
return cs;
}
}
return null;
}
static ExpressionNode nextLiteral(ObjectPool pool, CharSequence token, int position) {
return pool.next().of(ExpressionNode.LITERAL, token, 0, position);
}
static CharSequence createColumnAlias(CharacterStore store, CharSequence base, int indexOfDot, CharSequenceIntHashMap nameTypeMap) {
final boolean disallowed = disallowedAliases.contains(base);
// short and sweet version
if (indexOfDot == -1 && !disallowed && nameTypeMap.excludes(base)) {
return base;
}
final CharacterStoreEntry characterStoreEntry = store.newEntry();
if (indexOfDot == -1) {
if (disallowed) {
characterStoreEntry.put("column");
} else {
characterStoreEntry.put(base);
}
} else {
characterStoreEntry.put(base, indexOfDot + 1, base.length());
}
int len = characterStoreEntry.length();
int sequence = 0;
while (true) {
if (sequence > 0) {
characterStoreEntry.trimTo(len);
characterStoreEntry.put(sequence);
}
sequence++;
CharSequence alias = characterStoreEntry.toImmutable();
if (nameTypeMap.excludes(alias)) {
return alias;
}
}
}
static QueryColumn nextColumn(
ObjectPool queryColumnPool,
ObjectPool sqlNodePool,
CharSequence alias,
CharSequence column
) {
return queryColumnPool.next().of(alias, nextLiteral(sqlNodePool, column, 0));
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy