Skip to content
This repository has been archived by the owner on Jan 3, 2022. It is now read-only.

Commit

Permalink
Tests and fixes to the FOR LOOP in cursor and simplification of the P…
Browse files Browse the repository at this point in the history
…L/SQL parser clauses (removing non-used ones and renaming some others)
  • Loading branch information
tsutomi committed Apr 20, 2016
1 parent 8aa0d00 commit d77f86d
Show file tree
Hide file tree
Showing 10 changed files with 198 additions and 177 deletions.
20 changes: 20 additions & 0 deletions src/deveeldb-nunit/Deveel.Data.Sql.Compile/LoopTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,25 @@ END IF
var statement = result.Statements.ElementAt(0);
Assert.IsInstanceOf<LoopStatement>(statement);
}

[Test]
public void EmptyForLoop() {
const string sql = @"FOR i IN 32..56 LOOP
IF a = 33 THEN
EXIT;
END IF
END LOOP";

var result = Compile(sql);

Assert.IsNotNull(result);
Assert.IsFalse(result.HasErrors);

Assert.AreEqual(1, result.Statements.Count);

var statement = result.Statements.ElementAt(0);
Assert.IsInstanceOf<ForLoopStatement>(statement);
}

}
}
53 changes: 53 additions & 0 deletions src/deveeldb-nunit/Deveel.Data/LoopTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,39 @@
using Deveel.Data.Sql;
using Deveel.Data.Sql.Expressions;
using Deveel.Data.Sql.Statements;
using Deveel.Data.Sql.Tables;
using Deveel.Data.Sql.Types;

using NUnit.Framework;

namespace Deveel.Data {
[TestFixture]
public sealed class LoopTests : ContextBasedTest {
protected override void OnAfterSetup(string testName) {
if (testName == "SimpleCursorForLoop")
CreateTestTable();

base.OnAfterSetup(testName);
}

private void CreateTestTable() {
var tableName = ObjectName.Parse("APP.table1");
var tableInfo = new TableInfo(tableName);
tableInfo.AddColumn("a", PrimitiveTypes.Integer());
tableInfo.AddColumn("b", PrimitiveTypes.String());

Query.Access().CreateObject(tableInfo);

var table = Query.Access().GetMutableTable(tableName);

for (int i = 0; i < 50; i++) {
var row = table.NewRow();
row["a"] = Field.Integer(i);
row["b"] = Field.String(String.Format("b_{0}", i));
table.AddRow(row);
}
}

[Test]
public void LoopAndExitWithNoReturn() {
var loop = new LoopStatement();
Expand Down Expand Up @@ -58,5 +84,32 @@ public sealed class LoopTests : ContextBasedTest {
Assert.IsFalse(Field.IsNullField(value));
// TODO: the context should return the value of RETURN statement
}

[Test]
public void SimpleCursorForLoop() {
var query = (SqlQueryExpression) SqlExpression.Parse("SELECT * FROM table1");

var block = new PlSqlBlockStatement();
block.Declarations.Add(new DeclareCursorStatement("c1", query));

var loop = new CursorForLoopStatement("i", "c1");
loop.Statements.Add(new DeclareVariableStatement("a", PrimitiveTypes.String()));
loop.Statements.Add(new AssignVariableStatement(SqlExpression.VariableReference("a"),
SqlExpression.FunctionCall("cast",
new SqlExpression[] { SqlExpression.VariableReference("i"), SqlExpression.Constant("varchar") })));
loop.Statements.Add(
new ConditionStatement(SqlExpression.Equal(SqlExpression.VariableReference("i"), SqlExpression.Constant(50)),
new SqlStatement[] { new ReturnStatement(SqlExpression.VariableReference("a")) }));
block.Statements.Add(new OpenStatement("c1"));
block.Statements.Add(loop);
var result = Query.ExecuteStatement(block);

Assert.IsNotNull(result);
Assert.AreEqual(StatementResultType.Result, result.Type);

var value = result.Result.GetValue(0, 0);
Assert.IsNotNull(value);
Assert.IsFalse(Field.IsNullField(value));
}
}
}

0 comments on commit d77f86d

Please sign in to comment.