25  , mIgnoreStaticNodes( ignoreStaticNodes )
 
 
   56  QString quoted = identifier;
 
   57  quoted.replace( 
'"', QLatin1String( 
"\"\"" ) );
 
   58  quoted = quoted.prepend( 
'\"' ).append( 
'\"' );
 
 
   67    return QStringLiteral( 
"NULL" );
 
   69  switch ( value.userType() )
 
   71    case QMetaType::Type::Int:
 
   72    case QMetaType::Type::LongLong:
 
   73    case QMetaType::Type::Double:
 
   74      return value.toString();
 
   76    case QMetaType::Type::Bool:
 
   77      return value.toBool() ? QStringLiteral( 
"TRUE" ) : QStringLiteral( 
"FALSE" );
 
   80    case QMetaType::Type::QString:
 
   81      QString v = value.toString();
 
   82      v.replace( 
'\'', QLatin1String( 
"''" ) );
 
   83      if ( v.contains( 
'\\' ) )
 
   84        return v.replace( 
'\\', QLatin1String( 
"\\\\" ) ).prepend( 
"E'" ).append( 
'\'' );
 
   86        return v.prepend( 
'\'' ).append( 
'\'' );
 
 
   93  if ( staticRes != 
Fail )
 
  118        return nodeIsNumeric( op->
opLeft() ) && nodeIsNumeric( op->
opRight() );
 
  123        return nodeIsNumeric( op->
operand() );
 
  144            result = 
"( NOT " + right + 
')';
 
  159            result = 
"( - (" + right + 
"))";
 
  175      bool partialCompilation = 
false;
 
  176      bool failOnPartialNode = 
false;
 
  184            partialCompilation = 
true;
 
  187          op = QStringLiteral( 
"=" );
 
  191          op = QStringLiteral( 
">=" );
 
  195          op = QStringLiteral( 
">" );
 
  199          op = QStringLiteral( 
"<=" );
 
  203          op = QStringLiteral( 
"<" );
 
  207          op = QStringLiteral( 
"IS" );
 
  211          op = QStringLiteral( 
"IS NOT" );
 
  216          op = QStringLiteral( 
"LIKE" );
 
  222            op = QStringLiteral( 
"LIKE" );
 
  224            op = QStringLiteral( 
"ILIKE" );
 
  228          op = QStringLiteral( 
"NOT LIKE" );
 
  236            op = QStringLiteral( 
"NOT LIKE" );
 
  238            op = QStringLiteral( 
"NOT ILIKE" );
 
  244            if ( nodeIsNullLiteral( n->
opLeft() ) || nodeIsNullLiteral( n->
opRight() ) )
 
  248          op = QStringLiteral( 
"OR" );
 
  254            if ( nodeIsNullLiteral( n->
opLeft() ) || nodeIsNullLiteral( n->
opRight() ) )
 
  258          op = QStringLiteral( 
"AND" );
 
  263          op = QStringLiteral( 
"<>" );
 
  267          op = QStringLiteral( 
"*" );
 
  273          if ( nodeIsNumeric( nodeOp->
opLeft() ) && nodeIsNumeric( nodeOp->
opRight() ) )
 
  275            op = QStringLiteral( 
"+" );
 
  281          op = QStringLiteral( 
"-" );
 
  285          op = QStringLiteral( 
"/" );
 
  289          op = QStringLiteral( 
"%" );
 
  293          op = QStringLiteral( 
"||" );
 
  297          op = QStringLiteral( 
"/" );
 
  301          op = QStringLiteral( 
"^" );
 
  305          op = QStringLiteral( 
"~" );
 
  327        if ( right.isEmpty() )
 
  334      result = 
'(' + left + 
' ' + op + 
' ' + right + 
')';
 
  386      res.append( n->
negate() ? QStringLiteral( 
" NOT BETWEEN %1" ).arg( s ) : QStringLiteral( 
" BETWEEN %1" ).arg( s ) );
 
  401      res.append( QStringLiteral( 
" AND %1" ).arg( s ) );
 
  403      return betweenResult;
 
  431      if ( fieldIndex == -1 )
 
  446      const auto constList = n->
list()->
list();
 
  466      result = QStringLiteral( 
"%1 %2IN (%3)" ).arg( nd, n->
isNotIn() ? QStringLiteral( 
"NOT " ) : QString(), list.join( 
',' ) );
 
  484      const auto constList = n->
args()->
list();
 
  503      result = !nd.isEmpty() ? QStringLiteral( 
"%1(%2)" ).arg( nd, args.join( 
',' ) ) : args.join( 
',' );
 
 
  526  return QStringList( fnArgs );
 
 
  548  if ( mIgnoreStaticNodes )
 
 
  570bool QgsSqlExpressionCompiler::nodeIsNullLiteral( 
const QgsExpressionNode *node )
 const 
An abstract base class for defining QgsExpression functions.
 
QString name() const
The name of the function.
 
SQL-like BETWEEN and NOT BETWEEN predicates.
 
bool negate() const
Returns true if the predicate is an exclusion test (NOT BETWEEN).
 
QgsExpressionNode * lowerBound() const
Returns the lower bound expression node of the range.
 
QgsExpressionNode * higherBound() const
Returns the higher bound expression node of the range.
 
QgsExpressionNode * node() const
Returns the expression node.
 
A binary expression operator, which operates on two values.
 
QgsExpressionNode * opLeft() const
Returns the node to the left of the operator.
 
QgsExpressionNode * opRight() const
Returns the node to the right of the operator.
 
QgsExpressionNodeBinaryOperator::BinaryOperator op() const
Returns the binary operator.
 
BinaryOperator
list of binary operators
 
An expression node which takes its value from a feature's field.
 
QString name() const
The name of the column.
 
An expression node for expression functions.
 
int fnIndex() const
Returns the index of the node's function.
 
QgsExpressionNode::NodeList * args() const
Returns a list of arguments specified for the function.
 
An expression node for value IN or NOT IN clauses.
 
QgsExpressionNode * node() const
Returns the expression node.
 
QgsExpressionNode::NodeList * list() const
Returns the list of nodes to search for matching values within.
 
bool isNotIn() const
Returns true if this node is a "NOT IN" operator, or false if the node is a normal "IN" operator.
 
An expression node for literal values.
 
QVariant value() const
The value of the literal.
 
A unary node is either negative as in boolean (not) or as in numbers (minus).
 
QgsExpressionNodeUnaryOperator::UnaryOperator op() const
Returns the unary operator.
 
QgsExpressionNode * operand() const
Returns the node the operator will operate upon.
 
QList< QgsExpressionNode * > list()
Gets a list of all the nodes.
 
Abstract base class for all nodes that can appear in an expression.
 
bool hasCachedStaticValue() const
Returns true if the node can be replaced by a static cached value.
 
virtual QgsExpressionNode::NodeType nodeType() const =0
Gets the type of this node.
 
QVariant cachedStaticValue() const
Returns the node's static cached value.
 
NodeType
Known node types.
 
@ ntBetweenOperator
Between operator.
 
@ ntIndexOperator
Index operator.
 
Handles parsing and evaluation of expressions (formerly called "search strings").
 
static const QList< QgsExpressionFunction * > & Functions()
 
const QgsExpressionNode * rootNode() const
Returns the root node of the expression.
 
Container of fields for a vector layer.
 
Q_INVOKABLE int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
 
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
 
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
 
virtual Result compileNode(const QgsExpressionNode *node, QString &str)
Compiles an expression node and returns the result of the compilation.
 
virtual Result compile(const QgsExpression *exp)
Compiles an expression and returns the result of the compilation.
 
Result
Possible results from expression compilation.
 
@ Fail
Provider cannot handle expression.
 
@ Complete
Expression was successfully compiled and can be completely delegated to provider.
 
@ Partial
Expression was partially compiled, but provider will return extra records and results must be double-...
 
virtual QStringList sqlArgumentsFromFunctionName(const QString &fnName, const QStringList &fnArgs) const
Returns the Arguments for SQL function for the expression function.
 
virtual Result replaceNodeByStaticCachedValueIfPossible(const QgsExpressionNode *node, QString &str)
Tries to replace a node by its static cached value where possible.
 
virtual QString result()
Returns the compiled expression string for use by the provider.
 
virtual QString quotedValue(const QVariant &value, bool &ok)
Returns a quoted attribute value, in the format expected by the provider.
 
virtual QString castToText(const QString &value) const
Casts a value to a text result.
 
virtual QString castToInt(const QString &value) const
Casts a value to a integer result.
 
virtual QString quotedIdentifier(const QString &identifier)
Returns a quoted column identifier, in the format expected by the provider.
 
virtual QString sqlFunctionFromFunctionName(const QString &fnName) const
Returns the SQL function for the expression function.
 
QgsSqlExpressionCompiler(const QgsFields &fields, QgsSqlExpressionCompiler::Flags flags=Flags(), bool ignoreStaticNodes=false)
Constructor for expression compiler.
 
virtual QString castToReal(const QString &value) const
Casts a value to a real result.
 
bool opIsStringComparison(QgsExpressionNodeBinaryOperator::BinaryOperator op)
Returns true if op is one of.
 
@ LikeIsCaseInsensitive
Provider treats LIKE as case-insensitive.
 
@ NoUnaryMinus
Provider does not unary minus, e.g., " -( 100 * 2 ) = ...".
 
@ CaseInsensitiveStringMatch
Provider performs case-insensitive string matching for all strings.
 
@ NoNullInBooleanLogic
Provider does not support using NULL with boolean logic, e.g., "(...) OR NULL".
 
@ IntegerDivisionResultsInInteger
Dividing int by int results in int on provider. Subclass must implement the castToReal() function to ...
 
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
 
static bool isNumericType(QMetaType::Type metaType)
Returns true if the specified metaType is a numeric type.