我正在尝试实现一个表值函数(作为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;
}
我做错了什么或是不可能将非文字参数传递给表值函数?
答案 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时,我跳过它,即返回该索引的高估计成本,因此不会被使用。