diff --git a/src/deveeldb-nunit/Deveel.Data.Sql.Expressions/SqlConditionalExpressionTests.cs b/src/deveeldb-nunit/Deveel.Data.Sql.Expressions/SqlConditionalExpressionTests.cs
new file mode 100644
index 00000000..f899e283
--- /dev/null
+++ b/src/deveeldb-nunit/Deveel.Data.Sql.Expressions/SqlConditionalExpressionTests.cs
@@ -0,0 +1,58 @@
+using System;
+
+using NUnit.Framework;
+
+namespace Deveel.Data.Sql.Expressions {
+ [TestFixture]
+ public static class SqlConditionalExpressionTests {
+ [Test]
+ public static void SimpleCase() {
+ var first = SqlExpression.Constant(34);
+ var second = SqlExpression.Add(SqlExpression.Constant(10), SqlExpression.Constant(24));
+ var condition = SqlExpression.Equal(first, second);
+ var returnExpression = SqlExpression.Constant("It was equal");
+ var conditional = SqlExpression.Conditional(condition, returnExpression);
+
+ var result = conditional.EvaluateToConstant(null, null);
+
+ Assert.IsNotNull(result);
+ Assert.IsFalse(Field.IsNullField(result));
+ Assert.AreEqual("It was equal", result.Value.ToString());
+ }
+
+ [Test]
+ public static void SimpleCaseWithFalse() {
+ var first = SqlExpression.Constant(34);
+ var second = SqlExpression.Add(SqlExpression.Constant(10), SqlExpression.Constant(34));
+ var condition = SqlExpression.Equal(first, second);
+ var ifTrue = SqlExpression.Constant("It was equal");
+ var ifFalse = SqlExpression.Constant("It was not equal");
+
+ var conditional = SqlExpression.Conditional(condition, ifTrue, ifFalse);
+
+ var result = conditional.EvaluateToConstant(null, null);
+
+ Assert.IsNotNull(result);
+ Assert.IsFalse(Field.IsNullField(result));
+ Assert.AreEqual("It was not equal", result.Value.ToString());
+ }
+
+ [Test]
+ public static void CaseNestedFalse() {
+ var first = SqlExpression.Constant(34);
+ var second = SqlExpression.Add(SqlExpression.Constant(10), SqlExpression.Constant(34));
+ var condition = SqlExpression.Equal(first, second);
+ var ifTrue = SqlExpression.Constant("It was equal");
+ var ifFalseReturn = SqlExpression.Constant("It was not equal");
+ var ifFalse = SqlExpression.Conditional(SqlExpression.Constant(true), ifFalseReturn);
+
+ var conditional = SqlExpression.Conditional(condition, ifTrue, ifFalse);
+
+ var result = conditional.EvaluateToConstant(null, null);
+
+ Assert.IsNotNull(result);
+ Assert.IsFalse(Field.IsNullField(result));
+ Assert.AreEqual("It was not equal", result.Value.ToString());
+ }
+ }
+}
diff --git a/src/deveeldb-nunit/Deveel.Data/ConditionalTests.cs b/src/deveeldb-nunit/Deveel.Data/ConditionalTests.cs
new file mode 100644
index 00000000..5c981b1a
--- /dev/null
+++ b/src/deveeldb-nunit/Deveel.Data/ConditionalTests.cs
@@ -0,0 +1,40 @@
+using System;
+
+using Deveel.Data.Sql;
+using Deveel.Data.Sql.Expressions;
+using Deveel.Data.Sql.Statements;
+using Deveel.Data.Sql.Types;
+using Deveel.Data.Sql.Variables;
+
+using NUnit.Framework;
+
+namespace Deveel.Data {
+ [TestFixture]
+ public sealed class ConditionalTests : ContextBasedTest {
+ protected override void OnAfterSetup(string testName) {
+ Query.Access().CreateObject(new VariableInfo("a", PrimitiveTypes.Integer(), false) {
+ DefaultExpression = SqlExpression.Constant(34)
+ });
+
+ base.OnAfterSetup(testName);
+ }
+
+ protected override void OnBeforeTearDown(string testName) {
+ Query.Access().DropObject(DbObjectType.Variable, new ObjectName("a"));
+ base.OnBeforeTearDown(testName);
+ }
+
+ [Test]
+ public void SimpleConditional() {
+ var condition = SqlExpression.Equal(SqlExpression.VariableReference("a"), SqlExpression.Constant(34));
+ var ifTrue = new SqlStatement[] {
+ new DeclareVariableStatement("b", PrimitiveTypes.String()),
+ new AssignVariableStatement(SqlExpression.VariableReference("b"), SqlExpression.Constant(21)),
+ };
+
+ var result = Query.If(condition, ifTrue);
+
+ Assert.IsNotNull(result);
+ }
+ }
+}
diff --git a/src/deveeldb-nunit/deveeldb-nunit.csproj b/src/deveeldb-nunit/deveeldb-nunit.csproj
index 8f7705f2..dd934da1 100644
--- a/src/deveeldb-nunit/deveeldb-nunit.csproj
+++ b/src/deveeldb-nunit/deveeldb-nunit.csproj
@@ -135,6 +135,7 @@
+
@@ -149,6 +150,7 @@
+
diff --git a/src/deveeldb/Deveel.Data/RequestExtensions.cs b/src/deveeldb/Deveel.Data/RequestExtensions.cs
index 61360cfa..a45e98b9 100644
--- a/src/deveeldb/Deveel.Data/RequestExtensions.cs
+++ b/src/deveeldb/Deveel.Data/RequestExtensions.cs
@@ -521,6 +521,26 @@ public static class RequestExtensions {
#endregion
+ #region If
+
+ public static ITable If(this IRequest request, SqlExpression condition, SqlStatement[] ifTrue) {
+ return If(request, condition, ifTrue, new SqlStatement[0]);
+ }
+
+ public static ITable If(this IRequest request, SqlExpression condition, SqlStatement[] ifTrue, SqlStatement[] ifFalse) {
+ var result = request.ExecuteStatement(new ConditionStatement(condition, ifTrue, ifFalse));
+
+ if (result.Type == StatementResultType.Exception)
+ throw result.Error;
+
+ if (result.Type == StatementResultType.Result)
+ return result.Result;
+
+ throw new NotSupportedException("Cursor-ref in condition not supported (yet).");
+ }
+
+ #endregion
+
#endregion
}
}