[oracle] Fixes for oracle expression compilation

On behalf of Faunalia, sponsored by ENEL
This commit is contained in:
Nyall Dawson 2016-07-06 16:22:22 +10:00
parent d785b904ac
commit 64bfbaaf5b
2 changed files with 30 additions and 1 deletions

View File

@ -29,8 +29,15 @@ QgsSqlExpressionCompiler::Result QgsOracleExpressionCompiler::compileNode( const
switch ( bin->op() )
{
case QgsExpression::boConcat:
// oracle's handling of || WRT null is not standards compliant
return Fail;
case QgsExpression::boPow:
case QgsExpression::boRegexp:
case QgsExpression::boILike:
case QgsExpression::boNotILike:
case QgsExpression::boMod:
{
QString op1, op2;
@ -48,6 +55,18 @@ QgsSqlExpressionCompiler::Result QgsOracleExpressionCompiler::compileNode( const
result = QString( "regexp_like(%1,%2)" ).arg( op1, op2 );
return Complete;
case QgsExpression::boILike:
result = QString( "lower(%1) LIKE lower(%2)" ).arg( op1, op2 );
return Complete;
case QgsExpression::boNotILike:
result = QString( "NOT lower(%1) LIKE lower(%2)" ).arg( op1, op2 );
return Complete;
case QgsExpression::boMod :
result = QString( "MOD(%1,%2)" ).arg( op1, op2 );
return Complete;
default:
break;
}
@ -70,5 +89,14 @@ QString QgsOracleExpressionCompiler::quotedIdentifier( const QString& identifier
QString QgsOracleExpressionCompiler::quotedValue( const QVariant& value, bool& ok )
{
ok = true;
return QgsOracleConn::quotedValue( value );
switch ( value.type() )
{
case QVariant::Bool:
//no boolean literal support in Oracle, so fake it
return value.toBool() ? "(1=1)" : "(1=0)";
default:
return QgsOracleConn::quotedValue( value );
}
}

View File

@ -370,6 +370,7 @@ class ProviderTestCase(object):
def testGetFeaturesFidsTests(self):
fids = [f.id() for f in self.provider.getFeatures()]
self.assertEqual(len(fids), 5)
request = QgsFeatureRequest().setFilterFids([fids[0], fids[2]])
result = set([f.id() for f in self.provider.getFeatures(request)])