xBestIndex故障(将非文字参数传递给表值函数)

时间:2016-10-03 18:19:18

标签: sqlite system.data.sqlite

我正在尝试实现一个表值函数(作为SQLite虚拟表)。

这是一个函数,它接受一个字符串并返回一个包含字符串所有单词的表。

如果我用下面的文字值来调用它,它可以正常工作。

SELECT word FROM splitstring("abc def ghi")

但是,如果我用另一个表中的列调用它,则它不起作用:

SELECT a.Name, word FROM article a, splitstring(a.Text)

xBestIndex方法被调用,但在此之后,我从ExecuteReader方法中获得异常。异常消息是“xBestIndex故障”。由于异常,xFilter方法不会被调用。

我的xBestIndex实现很简单,它只是标记参数,所以我可以在xFilter中看到它:

public override SQLiteErrorCode BestIndex(SQLiteVirtualTable table, SQLiteIndex index)
{
    index.Outputs.ConstraintUsages.ElementAt(0).argvIndex = 1;
    index.Outputs.ConstraintUsages.ElementAt(0).omit = 1;

    return SQLiteErrorCode.Ok;
}

我做错了什么或是不可能将非文字参数传递给表值函数?

1 个答案:

答案 0 :(得分:0)

发现问题!我正在使用usable=0的约束。 SQLite多次调用BestIndex方法,第二次使用不可用的约束。

这是BestIndex方法的固定主体。

public override SQLiteErrorCode BestIndex(SQLiteVirtualTable table, SQLiteIndex index)
{
    if (index.Inputs.Constraints.Count() != 2)
        throw new ArgumentException("The generate_series function requires two integer (long) parameters!");

    if (index.Inputs.Constraints.All(c=>c.usable == 1))
    {
        index.Outputs.ConstraintUsages.ElementAt(0).argvIndex = 1;
        index.Outputs.ConstraintUsages.ElementAt(0).omit = 1;
        index.Outputs.ConstraintUsages.ElementAt(1).argvIndex = 2;
        index.Outputs.ConstraintUsages.ElementAt(1).omit = 1;
    }
    else
    {
        index.Outputs.IndexNumber = -1;
        index.Outputs.EstimatedCost = double.MaxValue;
    }

    return SQLiteErrorCode.Ok;
}

现在我检查可用的标志。当使用usable=0约束调用BestIndex时,我跳过它,即返回该索引的高估计成本,因此不会被使用。