If you parse such a simple query like

SELECT [*,] bla [, bla] FROM table-name WHERE blabla ,

you'll get into less troubles than if you play with the rowid trick. All you need is to check if returned colnames can be found in table-name. And it is a simple question using PRAGMA table_info(table-name);

Fanda

On Mon, 19 Dec 2005 22:11:32 +0100, Will Leshner <[EMAIL PROTECTED]> wrote:

Hi. I apologize in advance for the length of this question, but it is a little involved.

I am the author of a wrapper for SQLite and in that wrapper there is an object called a RecordSet that represents the results of a query. One of the things you can do with a RecordSet is edit records. The way I've implemented editing a RecordSet is to construct an UPDATE statement based on the new values for the fields of the record. The problem, though, is that while query results are always returned in the form of a RecordSet, not all RecordSets represent query results that are really editable in any meaningful way. The big problem is knowing which record is really being represented by a particular row in a RecordSet object. What I do is add a rowid column to every query. For many queries, this results in a syntax error. For example, if the query involves joins and such. That's exactly what I want to have happen. If I get a syntax error, then I know the results of the query aren't really something I want to let the user edit, so I requery without the rowid and just remember that the resulting RecordSet isn't editable. The problem, however, is that some queries allow a rowid column, but still shouldn't be editable. For example:

SELECT rowid,count(rowid) FROM table

One might argue that such a query should return an error, but even if it did, I couldn't rely on it, because this query is perfectly fine:

SELECT rowid,count(rowid) FROM table GROUP BY rowid

So, the question I have is this: Is there some way I can determine, short of parsing the SQL for myself, that the results of a query are "suitable for editing"? I think, by "suitable for editing", that I mean the results all come from one table and only include natural columns of that table. I'm perfectly happy to detect "suitability" during the execution of the VM. I have my own loop where I call sqlite3_step and such, if that makes any difference. For example, if I had a way to know, during the execution of the VM, that the results were coming from more than one table at the same time, that would certainly be a big step in the right direction.

A related topic is the ability to get the rowid of the rows returned by a query without having to add the 'rowid' column explicitly. Right now I manually add 'rowid' in the wrapper, but I really hate doing that because I'd like to touch the user's SQL as little as possible. I think it would be really cool if there were a way to tell SQLite to return, along with the regular results, the rowid for each row. If 'rowid' makes no sense for the query, then maybe SQLite could return some kind of ILLEGAL_ROWID value. Would anybody else find such a thing useful?

Thanks.



Reply via email to