On 2016/04/13 4:58 PM, Igor Korot wrote:
>   Hi,,
>
> On Wed, Apr 13, 2016 at 10:54 AM, J Decker <d3ck0r at gmail.com> wrote:
>> Yes, you can get the create statement from sqlite_master table
> I was kind of hoping for a simpler solution so that not to parse "CREATE 
> TABLE"
> statement...
>
> Well, I guess I will have to.
>
> Thank you.

Hi Igor,

Note that SQLite will auto increment PK fields whether AUTOINCREMENT is 
present or not, it just ensures non-repeats and guaranteed increments 
when present.

Either way, this following query will give the column in any table that 
is AUTOINCREMENTed (if any), just replace 'AutoIncTable' with your table 
name (or bind it).

    WITH WS(WhSpc) AS (
         SELECT char(9)||char(10)||char(13)||char(32) -- White space chars
    ), AI(idxStart, idxAuto, sql) AS (
         SELECT instr(sql,'('), instr(upper(sql),' AUTOINCREMENT'), sql
           FROM "sqlite_master" WHERE type = 'table' AND tbl_name =
    'AutoIncTable' -- < Replace your table here
    ), PRS(idxNextComma, remainText) AS (
         SELECT 1, ','||trim(substr(sql,idxStart+1,idxAuto-idxStart),WhSpc)
           FROM AI,WS
          WHERE idxStart>1 AND idxAuto>idxStart
       UNION ALL
         SELECT instr(substr(trim(remainText,WhSpc),
    idxNextComma+1),','), substr(trim(remainText,WhSpc), idxNextComma+1)
           FROM PRS,WS
          WHERE idxNextComma > 0
    ), WRD(idxSpace, remText) AS (
         SELECT 999, remainText FROM PRS WHERE idxNextComma = 0
       UNION ALL
         SELECT instr(trim(substr(remText, 1, idxSpace)),' '),
    trim(substr(remText, 1, idxSpace)) FROM WRD WHERE idxSpace > 0
    )
    SELECT trim(remText,'['' "`]') AS AutoInc_Col FROM WRD WHERE
    idxSPace = 0



Note 1 - You CAN break it by adding /* comments */  in between the 
column name and the AUTOINCREMENT keyword in your table definition, and 
then have the comment contain the said keyword or commas, but this 
should not ever be the case in a normal table, less so if you control 
the schema.

Note 2 - Parsing out comments first would make it foolproof, but I will 
leave that exercise for if you really need it and/or fancy actually 
using this method.

Note 3 - It's not crazy efficient, but usually the amount of tables in a 
schema is not that large.


Cheers,
Ryan

Reply via email to