QGIS API Documentation
3.16.0-Hannover (43b64b13f3)
|
Go to the documentation of this file.
34 "=",
"<>",
"<=",
">=",
"<",
">",
"LIKE",
"NOT LIKE",
"ILIKE",
"NOT ILIKE",
"IS",
"IS NOT",
35 "+",
"-",
"*",
"/",
"//",
"%",
"^",
48 "",
"LEFT",
"LEFT OUTER",
"RIGHT",
"RIGHT OUTER",
"CROSS",
"INNER",
"FULL"
64 return tr(
"(no root)" );
71 return QStringLiteral(
"\"%1\"" ).arg( name.replace(
'\"', QLatin1String(
"\"\"" ) ) );
77 static const char *
const RESERVED_KEYWORDS[] =
79 "AND",
"OR",
"NOT",
"LIKE",
"IN",
"IS",
"BETWEEN",
"NULL",
"SELECT",
"ALL",
"DISTINCT",
"CAST",
"AS",
80 "FROM",
"JOIN",
"ON",
"USING",
"WHERE",
"ORDER",
"BY",
"ASC",
"DESC",
81 "LEFT",
"RIGHT",
"INNER",
"OUTER",
"CROSS",
"FULL",
"NATURAL",
"UNION",
82 "OFFSET",
"LIMIT",
"GROUP",
"HAVING"
85 for (
size_t i = 0; i <
sizeof( RESERVED_KEYWORDS ) /
sizeof( RESERVED_KEYWORDS[0] ); ++i )
87 if ( name.compare( QString( RESERVED_KEYWORDS[i] ), Qt::CaseInsensitive ) == 0 )
92 static const QRegExp IDENTIFIER_RE(
"^[A-Za-z_\x80-\xff][A-Za-z0-9_\x80-\xff]*$" );
98 if ( text.length() >= 2 && text[0] ==
'"' && text[text.length() - 1] ==
'"' )
101 text = text.mid( 1, text.length() - 2 );
104 text.replace( QLatin1String(
"\"\"" ), QLatin1String(
"\"" ) );
111 if ( text.length() >= 2 && text[0] ==
'[' && text[text.length() - 1] ==
']' )
114 text = text.mid( 1, text.length() - 2 );
121 text.replace(
'\'', QLatin1String(
"''" ) );
122 text.replace(
'\\', QLatin1String(
"\\\\" ) );
123 text.replace(
'\n', QLatin1String(
"\\n" ) );
124 text.replace(
'\t', QLatin1String(
"\\t" ) );
125 return QStringLiteral(
"'%1'" ).arg( text );
134 : mAllowFragments( allowFragments )
148 if ( &other !=
this )
180 const auto constTables = n.
tables();
183 table->accept( *
this );
185 const auto constColumns = n.
columns();
188 column->accept( *
this );
190 const auto constJoins = n.
joins();
193 join->accept( *
this );
198 const auto constOrderBy = n.
orderBy();
201 column->accept( *
this );
244 tableNamesDeclared.insert( n.
alias().isEmpty() ? n.
name() : n.
alias() );
253 errorMsgOut = tr(
"No root node" );
263 if ( !errorMsgOut.isEmpty() )
264 errorMsgOut += QLatin1Char(
' ' );
265 errorMsgOut += tr(
"Table %1 is referenced by column %2, but not selected in FROM / JOIN." ).arg( pair.first, pair.second );
269 return errorMsgOut.isEmpty();
286 const auto constMList = mList;
287 for (
Node *node : constMList )
289 nl->
mList.append( node->clone() );
299 const auto constMList = mList;
300 for (
Node *n : constMList )
302 if ( !first ) msg += QLatin1String(
", " );
365 Q_ASSERT(
false &&
"unexpected binary operator" );
400 Q_ASSERT(
false &&
"unexpected binary operator" );
410 QString rdump( mOpRight->dump() );
415 rdump.prepend(
'(' ).append(
')' );
419 if ( leftAssociative() )
421 fmt += lOp && ( lOp->
precedence() < precedence() ) ?
"(%1)" :
"%1";
422 fmt += QLatin1String(
" %2 " );
423 fmt += rOp && ( rOp->
precedence() <= precedence() ) ?
"(%3)" :
"%3";
427 fmt += lOp && ( lOp->
precedence() <= precedence() ) ?
"(%1)" :
"%1";
428 fmt += QLatin1String(
" %2 " );
429 fmt += rOp && ( rOp->
precedence() < precedence() ) ?
"(%3)" :
"%3";
444 return QStringLiteral(
"%1 %2IN (%3)" ).arg( mNode->dump(), mNotIn ?
"NOT " :
"", mList->dump() );
449 return new NodeInOperator( mNode->clone(), mList->clone(), mNotIn );
456 return QStringLiteral(
"%1 %2BETWEEN %3 AND %4" ).arg( mNode->dump(), mNotBetween ?
"NOT " :
"", mMinVal->dump(), mMaxVal->dump() );
461 return new NodeBetweenOperator( mNode->clone(), mMinVal->clone(), mMaxVal->clone(), mNotBetween );
468 return QStringLiteral(
"%1(%2)" ).arg( mName, mArgs ? mArgs->dump() : QString() );
473 return new NodeFunction( mName, mArgs ? mArgs->clone() :
nullptr );
480 if ( mValue.isNull() )
481 return QStringLiteral(
"NULL" );
483 switch ( mValue.type() )
486 return QString::number( mValue.toInt() );
487 case QVariant::LongLong:
488 return QString::number( mValue.toLongLong() );
489 case QVariant::Double:
490 return QString::number( mValue.toDouble() );
491 case QVariant::String:
494 return mValue.toBool() ?
"TRUE" :
"FALSE";
496 return tr(
"[unsupported type: %1; value: %2]" ).arg( mValue.typeName(), mValue.toString() );
511 ret += QLatin1String(
"DISTINCT " );
512 if ( !mTableName.isEmpty() )
538 ret += mColumnNode->dump();
539 if ( !mAlias.isEmpty() )
541 ret += QLatin1String(
" AS " );
564 if ( !mAlias.isEmpty() )
566 ret += QLatin1String(
" AS " );
586 qDeleteAll( mTableList );
587 qDeleteAll( mColumns );
588 qDeleteAll( mJoins );
590 qDeleteAll( mOrderBy );
595 QString ret = QStringLiteral(
"SELECT " );
597 ret += QLatin1String(
"DISTINCT " );
598 bool bFirstColumn =
true;
599 const auto constMColumns = mColumns;
603 ret += QLatin1String(
", " );
604 bFirstColumn =
false;
605 ret += column->dump();
607 ret += QLatin1String(
" FROM " );
608 bool bFirstTable =
true;
609 const auto constMTableList = mTableList;
613 ret += QLatin1String(
", " );
615 ret += table->dump();
617 const auto constMJoins = mJoins;
625 ret += QLatin1String(
" WHERE " );
626 ret += mWhere->dump();
628 if ( !mOrderBy.isEmpty() )
630 ret += QLatin1String(
" ORDER BY " );
632 const auto constMOrderBy = mOrderBy;
636 ret += QLatin1String(
", " );
638 ret += orderBy->dump();
646 QList<QgsSQLStatement::NodeSelectedColumn *> newColumnList;
647 const auto constMColumns = mColumns;
650 newColumnList.push_back( column->cloneThis() );
652 QList<QgsSQLStatement::NodeTableDef *> newTableList;
653 const auto constMTableList = mTableList;
656 newTableList.push_back( table->cloneThis() );
659 const auto constMJoins = mJoins;
666 newSelect->
setWhere( mWhere->clone() );
668 QList<QgsSQLStatement::NodeColumnSorted *> newOrderByList;
669 const auto constMOrderBy = mOrderBy;
672 newOrderByList.push_back( columnSorted->cloneThis() );
686 ret += QLatin1Char(
' ' );
688 ret += QLatin1String(
"JOIN " );
689 ret += mTableDef->dump();
692 ret += QLatin1String(
" ON " );
693 ret += mOnExpr->dump();
697 ret += QLatin1String(
" USING (" );
699 const auto constMUsingColumns = mUsingColumns;
700 for ( QString column : constMUsingColumns )
703 ret += QLatin1String(
", " );
707 ret += QLatin1Char(
')' );
720 return new NodeJoin( mTableDef->cloneThis(), mOnExpr->clone(), mType );
722 return new NodeJoin( mTableDef->cloneThis(), mUsingColumns, mType );
730 ret = mColumn->dump();
732 ret += QLatin1String(
" DESC" );
750 QString ret( QStringLiteral(
"CAST(" ) );
751 ret += mNode->dump();
752 ret += QLatin1String(
" AS " );
760 return new NodeCast( mNode->clone(), mType );
QString tableName() const
The name of the table. May be empty.
void accept(QgsSQLStatement::Visitor &v) const override
Support the visitor pattern.
QgsSQLStatement::Node * mRootNode
static QString stripQuotedIdentifier(QString text)
Remove double quotes from an identifier.
QgsSQLStatement(const QString &statement)
Creates a new statement based on the provided string.
QString dump() const override
Abstract virtual dump method.
QPair< QString, QString > TableColumnPair
QString name() const
Table name.
bool leftAssociative() const
Is left associative ?
QString dump() const override
Abstract virtual dump method.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
void setOrderBy(const QList< QgsSQLStatement::NodeColumnSorted * > &orderBy)
Sets order by columns.
void setWhere(QgsSQLStatement::Node *where)
Sets where clause.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
QgsSQLStatement::NodeColumnRef * cloneThis() const
Clone with same type return.
static const char * JOIN_TYPE_TEXT[]
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
Function with a name and arguments node.
void acceptVisitor(QgsSQLStatement::Visitor &v) const
Entry function for the visitor pattern.
QString dump() const
Returns the statement string, constructed from the internal abstract syntax tree.
QgsSQLStatement::Node * where() const
Returns the where clause.
QgsSQLStatement::NodeTableDef * cloneThis() const
Clone with same type return.
void setDistinct(bool distinct=true)
Sets whether this is prefixed by DISTINCT.
void visit(const QgsSQLStatement::NodeColumnRef &n) override
Visit NodeColumnRef.
QString dump() const override
Abstract virtual dump method.
Unary logicial/arithmetical operator ( NOT, - )
void appendJoin(QgsSQLStatement::NodeJoin *join)
Append a join.
QgsSQLStatement::NodeList * clone() const
Creates a deep copy of this list. Ownership is transferred to the caller.
QString dump() const override
Abstract virtual dump method.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
QgsSQLStatementFragment(const QString &fragment)
Constructor for QgsSQLStatementFragment of the specified fragment.
QList< QgsSQLStatement::NodeSelectedColumn * > columns() const
Returns the list of columns.
QgsSQLStatement::NodeTableDef * tableDef() const
Table definition.
Support for visitor pattern - algorithms dealing with the statement may be implemented without modify...
QString dump() const override
Abstract virtual dump method.
static QString stripMsQuotedIdentifier(QString text)
Remove double quotes from an Microsoft style identifier.
QString statement() const
Returns the original, unmodified statement string.
static QString quotedString(QString text)
Returns a quoted version of a string (in single quotes)
const QgsSQLStatement::Node * rootNode() const
Returns the root node of the statement.
QgsSQLStatement::NodeJoin * cloneThis() const
Clone with same type return.
bool hasParserError() const
Returns true if an error occurred when parsing the input statement.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
QgsSQLStatement::UnaryOperator op() const
Operator.
QString alias() const
Table alias.
QSet< TableColumnPair > tableNamesReferenced
QgsSQLStatement::NodeColumnSorted * cloneThis() const
Clone with same type return.
QString mParserErrorString
QgsSQLStatementCollectTableNames()=default
Constructor for QgsSQLStatementCollectTableNames.
static const char * BINARY_OPERATOR_TEXT[]
Class for parsing SQL statements.
int precedence() const
Precedence.
QList< QgsSQLStatement::NodeTableDef * > tables() const
Returns the list of tables.
void setAlias(const QString &alias)
Sets alias name.
virtual QString dump() const =0
Abstract virtual dump method.
QgsSQLStatement & operator=(const QgsSQLStatement &other)
Create a copy of this statement.
QString dump() const override
Abstract virtual dump method.
QString dump() const override
Abstract virtual dump method.
QString dump() const override
Abstract virtual dump method.
bool doBasicValidationChecks(QString &errorMsgOut) const
Performs basic validity checks.
Binary logical/arithmetical operator (AND, OR, =, +, ...)
QList< QgsSQLStatement::NodeColumnSorted * > orderBy() const
Returns the list of order by columns.
static const char * UNARY_OPERATOR_TEXT[]
virtual void accept(QgsSQLStatement::Visitor &v) const =0
Support the visitor pattern.
QList< QgsSQLStatement::NodeJoin * > joins() const
Returns the list of joins.
QString dump() const override
Abstract virtual dump method.
void visit(const QgsSQLStatement::NodeUnaryOperator &n) override
Visit NodeUnaryOperator.
virtual QString dump() const
Dump list.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
QgsSQLStatement::NodeSelectedColumn * cloneThis() const
Clone with same type return.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
QString dump() const override
Abstract virtual dump method.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
static QString quotedIdentifier(QString name)
Returns a quoted column reference (in double quotes)
QString dump() const override
Abstract virtual dump method.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
QSet< QString > tableNamesDeclared
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
A visitor that recursively explores all children.
void accept(QgsSQLStatement::Visitor &v) const
Accept visitor.
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
QString name() const
The name of the column.
QString dump() const override
Abstract virtual dump method.
'X BETWEEN y and z' operator
static QString quotedIdentifierIfNeeded(const QString &name)
Returns a quoted column reference (in double quotes) if needed, or otherwise the original string.
QgsSQLStatement::Node * onExpr() const
On expression. Will be nullptr if usingColumns() is not empty.
virtual ~QgsSQLStatement()
QString dump() const override
Abstract virtual dump method.
QString parserErrorString() const
Returns parser error.
QgsSQLStatement::Node * parse(const QString &str, QString &parserErrorMsg, bool allowFragments)
QgsSQLStatement::Node * clone() const override
Generate a clone of this node.
Literal value (integer, integer64, double, string)