###############################################################################
#
# tkt-ae5267b863.eagle --
#
# Written by Joe Mistachkin.
# Released to the public domain, use at your own risk!
#
###############################################################################
package require Eagle
package require Eagle.Library
package require Eagle.Test
runTestPrologue
###############################################################################
package require System.Data.SQLite.Test
runSQLiteTestPrologue
###############################################################################
#
# NOTE: For some reason, this test does not play nicely when all the managed
# debugging assistants are enabled.
#
runTest {test tkt-ae5267b863-1.1 {segfault during command GC} -setup {
setupDb [set fileName tkt-ae5267b863-1.1.db]
} -body {
set id [object invoke Interpreter.GetActive NextId]
set dataSource [file join [getDatabaseDirectory] $fileName]
set sql(1) { \
CREATE TABLE t1( \
__rowid INTEGER PRIMARY KEY AUTOINCREMENT, \
z STRING \
); \
}
set sql(2) { \
CREATE VIRTUAL TABLE t2 USING RTREE( \
id, minx, maxx, miny, maxy \
); \
}
set sql(3) { \
INSERT INTO t1 VALUES({0}, \"value {0}\"); \
}
set sql(4) { \
INSERT INTO t2 VALUES({0}, {0}, {0}, {0}, {0}); \
}
set sql(5) { \
SELECT COUNT(*) FROM t1, t2 \
WHERE t1.__rowid = t2.id AND \
(t2.minx <= :xmax and t2.miny <= :ymax and \
t2.maxx >= :xmin and t2.maxy >= :ymin); \
}
unset -nocomplain results errors
set code [compileCSharpWith [subst {
using System;
using System.Data.SQLite;
namespace _Dynamic${id}
{
public static class Test${id}
{
public static void Main()
{
using (SQLiteConnection connection = new SQLiteConnection(
"Data Source=${dataSource};[getTestProperties]"))
{
connection.Open();
using (SQLiteCommand command = connection.CreateCommand())
{
command.CommandText = "${sql(1)}";
command.ExecuteNonQuery();
command.CommandText = "${sql(2)}";
command.ExecuteNonQuery();
}
using (SQLiteCommand command = connection.CreateCommand())
{
using (SQLiteTransaction transaction =
connection.BeginTransaction())
{
for (int index = 0; index < 10; index++)
{
command.CommandText = String.Format("${sql(3)}", index);
command.ExecuteNonQuery();
command.CommandText = String.Format("${sql(4)}", index);
command.ExecuteNonQuery();
}
transaction.Commit();
}
}
//
// NOTE: Perform a huge amount of command creation and execution
// cycles for a better chance to trigger the bug.
//
for (int index = 0; index < 100000; index++)
{
//
// NOTE: Purposely omit the 'using' block here to test
// command disposal via the garbage collector.
//
SQLiteCommand command = connection.CreateCommand();
command.CommandText = "${sql(5)}";
command.Parameters.Add(new SQLiteParameter(":xmin", 2));
command.Parameters.Add(new SQLiteParameter(":xmax", 8));
command.Parameters.Add(new SQLiteParameter(":ymin", 2));
command.Parameters.Add(new SQLiteParameter(":ymax", 8));
using (SQLiteDataReader reader = command.ExecuteReader())
{
while (reader.Read()) {
//
// do nothing.
//
}
}
}
connection.Close();
}
}
}
}
}] true true true results errors System.Data.SQLite.dll]
list $code $results \
[expr {[info exists errors] ? $errors : ""}] \
[expr {$code eq "Ok" ? [catch {
object invoke _Dynamic${id}.Test${id} Main
} result] : [set result ""]}] $result
} -cleanup {
cleanupDb $fileName
unset -nocomplain result code results errors sql dataSource id db fileName
} -constraints [fixConstraints {eagle command.object monoBug28 monoBug211\
command.sql compile.DATA SQLite System.Data.SQLite !mda compileCSharp\
!defineConstant.System.Data.SQLite.INTEROP_LEGACY_CLOSE}] -match regexp \
-result {^Ok System#CodeDom#Compiler#CompilerResults#\d+ \{\} 0 \{\}$}}
###############################################################################
runSQLiteTestEpilogue
runTestEpilogue