43 if ( op == QgsExpressionNodeBinaryOperator::BinaryOperator::boILike ||
44 op == QgsExpressionNodeBinaryOperator::BinaryOperator::boLike ||
45 op == QgsExpressionNodeBinaryOperator::BinaryOperator::boNotILike ||
46 op == QgsExpressionNodeBinaryOperator::BinaryOperator::boNotLike ||
47 op == QgsExpressionNodeBinaryOperator::BinaryOperator::boRegexp )
55 QString quoted = identifier;
56 quoted.replace(
'"', QLatin1String(
"\"\"" ) );
57 quoted = quoted.prepend(
'\"' ).append(
'\"' );
66 return QStringLiteral(
"NULL" );
68 switch ( value.type() )
71 case QVariant::LongLong:
72 case QVariant::Double:
73 return value.toString();
76 return value.toBool() ? QStringLiteral(
"TRUE" ) : QStringLiteral(
"FALSE" );
79 case QVariant::String:
80 QString v = value.toString();
81 v.replace(
'\'', QLatin1String(
"''" ) );
82 if ( v.contains(
'\\' ) )
83 return v.replace(
'\\', QLatin1String(
"\\\\" ) ).prepend(
"E'" ).append(
'\'' );
85 return v.prepend(
'\'' ).append(
'\'' );
103 result =
"( NOT " + right +
')';
118 result =
"( - (" + right +
"))";
134 bool partialCompilation =
false;
135 bool failOnPartialNode =
false;
143 partialCompilation =
true;
146 op = QStringLiteral(
"=" );
150 op = QStringLiteral(
">=" );
154 op = QStringLiteral(
">" );
158 op = QStringLiteral(
"<=" );
162 op = QStringLiteral(
"<" );
166 op = QStringLiteral(
"IS" );
170 op = QStringLiteral(
"IS NOT" );
175 op = QStringLiteral(
"LIKE" );
181 op = QStringLiteral(
"LIKE" );
183 op = QStringLiteral(
"ILIKE" );
187 op = QStringLiteral(
"NOT LIKE" );
195 op = QStringLiteral(
"NOT LIKE" );
197 op = QStringLiteral(
"NOT ILIKE" );
203 if ( nodeIsNullLiteral( n->
opLeft() ) || nodeIsNullLiteral( n->
opRight() ) )
207 op = QStringLiteral(
"OR" );
213 if ( nodeIsNullLiteral( n->
opLeft() ) || nodeIsNullLiteral( n->
opRight() ) )
217 op = QStringLiteral(
"AND" );
222 op = QStringLiteral(
"<>" );
226 op = QStringLiteral(
"*" );
230 op = QStringLiteral(
"+" );
234 op = QStringLiteral(
"-" );
238 op = QStringLiteral(
"/" );
242 op = QStringLiteral(
"%" );
246 op = QStringLiteral(
"||" );
250 op = QStringLiteral(
"/" );
254 op = QStringLiteral(
"^" );
258 op = QStringLiteral(
"~" );
280 if ( right.isEmpty() )
287 result =
'(' + left +
' ' + op +
' ' + right +
')';
291 if ( result.isEmpty() )
343 const auto constList = n->
list()->
list();
363 result = QStringLiteral(
"%1 %2IN (%3)" ).arg( nd, n->
isNotIn() ? QStringLiteral(
"NOT " ) : QString(), list.join(
',' ) );
381 const auto constList = n->
args()->
list();
400 result = QStringLiteral(
"%1(%2)" ).arg( nd, args.join(
',' ) );
423 return QStringList( fnArgs );
443 bool QgsSqlExpressionCompiler::nodeIsNullLiteral(
const QgsExpressionNode *node )
const 449 return nLit->
value().isNull();
Class for parsing and evaluation of expressions (formerly called "search strings").
QgsExpressionNode::NodeList * args() const
Returns a list of arguments specified for the function.
virtual QString castToText(const QString &value) const
Casts a value to a text result.
Provider treats LIKE as case-insensitive.
QgsExpressionNode * opRight() const
Returns the node to the right of the operator.
virtual Result compile(const QgsExpression *exp)
Compiles an expression and returns the result of the compilation.
Container of fields for a vector layer.
QgsExpressionNode::NodeList * list() const
Returns the list of nodes to search for matching values within.
Provider cannot handle expression.
QgsExpressionNode * opLeft() const
Returns the node to the left of the operator.
QString name() const
The name of the column.
Provider does not support using NULL with boolean logic, e.g., "(...) OR NULL".
QgsSqlExpressionCompiler(const QgsFields &fields, QgsSqlExpressionCompiler::Flags flags=Flags())
Constructor for expression compiler.
Provider does not unary minus, e.g., " -( 100 * 2 ) = ...".
int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
virtual QString quotedValue(const QVariant &value, bool &ok)
Returns a quoted attribute value, in the format expected by the provider.
virtual QStringList sqlArgumentsFromFunctionName(const QString &fnName, const QStringList &fnArgs) const
Returns the Arguments for SQL function for the expression function.
BinaryOperator
list of binary operators
An expression node for value IN or NOT IN clauses.
An expression node which takes it value from a feature's field.
bool opIsStringComparison(QgsExpressionNodeBinaryOperator::BinaryOperator op)
Returns true if op is one of.
Abstract base class for all nodes that can appear in an expression.
An expression node for expression functions.
static const QList< QgsExpressionFunction * > & Functions()
QString name() const
The name of the function.
virtual QString sqlFunctionFromFunctionName(const QString &fnName) const
Returns the SQL function for the expression function.
A abstract base class for defining QgsExpression functions.
QList< QgsExpressionNode * > list()
Gets a list of all the nodes.
QgsExpressionNodeUnaryOperator::UnaryOperator op() const
Returns the unary operator.
virtual QString castToInt(const QString &value) const
Casts a value to a integer result.
Result
Possible results from expression compilation.
An expression node for literal values.
Expression was partially compiled, but provider will return extra records and results must be double-...
Expression was successfully compiled and can be completely delegated to provider. ...
const QgsExpressionNode * rootNode() const
Returns the root node of the expression.
virtual QString castToReal(const QString &value) const
Casts a value to a real result.
A unary node is either negative as in boolean (not) or as in numbers (minus).
Provider performs case-insensitive string matching for all strings.
A binary expression operator, which operates on two values.
virtual QString quotedIdentifier(const QString &identifier)
Returns a quoted column identifier, in the format expected by the provider.
virtual Result compileNode(const QgsExpressionNode *node, QString &str)
Compiles an expression node and returns the result of the compilation.
virtual QString result()
Returns the compiled expression string for use by the provider.
QgsExpressionNode * node() const
Returns the expression node.
bool isNotIn() const
Returns true if this node is a "NOT IN" operator, or false if the node is a normal "IN" operator...
virtual QgsExpressionNode::NodeType nodeType() const =0
Gets the type of this node.
QgsExpressionNode * operand() const
Returns the node the operator will operate upon.
QgsExpressionNodeBinaryOperator::BinaryOperator op() const
Returns the binary operator.
QVariant value() const
The value of the literal.
int fnIndex() const
Returns the index of the node's function.
Dividing int by int results in int on provider. Subclass must implement the castToReal() function to ...