So I'm playing with it a bit. So indeed there's some more code executed in the sqlite plan part, but that's minimal and it's only one per plan.
I'm not really sure how to have it create more than one plan, I hope it's not possible for it to create hundreds depending on some variable input in the query.
That been said what I've noticed is that it seems we are also calling the table even if we know that the required constraints aren't there.
Shouldn't we avoid that?
There's also a rare case when you have a table which has an index column which is not required and another column which is required.
So if you give everything correctly and you use an IN operator on the index column, xFilter gets called for each value in the IN list.
Same thing apparently with a JOIN and rows; there's indeed a comment in virtual_table.cpp that talks about that.
Though if you still use the IN operator but do not put the other required column in the query, it means that you're calling again xFilter multiple times, also calling the table as a consequence.
Not only that but it prints the warning message once for each element in the IN list.