You are correct that same table names in temp obscure those names from main and 
other attached databases, so your order by addition is required.

  select name
    from pragma_database_list as d
   where exists (select *
                   from pragma_table_info
                  where schema == d.name
                    and arg == ?)
order by seq != 1, seq
   limit 1;

-- 
The fact that there's a Highway to Hell but only a Stairway to Heaven says a 
lot about anticipated traffic volume.

>-----Original Message-----
>From: sqlite-users <sqlite-users-boun...@mailinglists.sqlite.org> On
>Behalf Of Keith Medcalf
>Sent: Monday, 20 January, 2020 02:18
>To: SQLite mailing list <sqlite-users@mailinglists.sqlite.org>
>Subject: Re: [sqlite] Find schema of a table in a query
>
>
>The "main" database is always seq == 0, the "temp" database is always seq
>== 1, and other databases are seq == 2 and greater in the order they were
>attached.  seq 2 -> whatever is always contiguous.  The table search
>order for unqualified names (when a search is required) is always in the
>seq returned by pragma database_list, so
>
>select name
>  from pragma_database_list as d
> where exists (select *
>                 from pragma_table_info
>                where schema == d.name
>                  and arg == 'x')
> limit 1;
>
>will always return the correct schema name, no order by required.  (and
>you can use table_info rather than table_xinfo because a table must
>always have one named column that is not hidden.  If this were not the
>case, then you would have to use table_xinfo to ensure that something is
>returned for that pragma lookup.
>
>SQLite version 3.31.0 2020-01-20 03:22:36
>Enter ".help" for usage hints.
>Connected to a transient in-memory database.
>Use ".open FILENAME" to reopen on a persistent database.
>sqlite> attach database ':memory:' as two;
>sqlite> attach database ':memory:' as three;
>sqlite> attach database ':memory:' as four;
>sqlite> attach database ':memory:' as five;
>sqlite> create table main.x(x);
>sqlite> insert into main.x values (0);
>sqlite> create table temp.x(x);
>sqlite> insert into temp.x values (1);
>sqlite> create table two.x(x);
>sqlite> insert into two.x values (2);
>sqlite> create table three.x(x);
>sqlite> insert into three.x values (3);
>sqlite> create table four.x(x);
>sqlite> insert into four.x values (4);
>sqlite> create table five.x(x);
>sqlite> insert into five.x values (5);
>sqlite> pragma database_list;
>0|main|
>1|temp|
>2|two|
>3|three|
>4|four|
>5|five|
>sqlite> detach database three;
>sqlite> pragma database_list;
>0|main|
>1|temp|
>2|two|
>3|four|
>4|five|
>sqlite> select * from x;
>1
>sqlite> select name
>   ...>   from pragma_database_list as d
>   ...>  where exists (select *
>   ...>                  from pragma_table_xinfo
>   ...>                 where schema == d.name
>   ...>                   and arg == 'x')
>   ...>  limit 1;
>main
>sqlite> drop table main.x;
>sqlite> select * from x;
>1
>sqlite> select name
>   ...>   from pragma_database_list as d
>   ...>  where exists (select *
>   ...>                  from pragma_table_xinfo
>   ...>                 where schema == d.name
>   ...>                   and arg == 'x')
>   ...>  limit 1;
>temp
>sqlite> drop table four.x;
>sqlite> select * from x;
>1
>sqlite> select name
>   ...>   from pragma_database_list as d
>   ...>  where exists (select *
>   ...>                  from pragma_table_xinfo
>   ...>                 where schema == d.name
>   ...>                   and arg == 'x')
>   ...>  limit 1;
>temp
>sqlite> drop table temp.x;
>sqlite> select * from x;
>2
>sqlite> select name
>   ...>   from pragma_database_list as d
>   ...>  where exists (select *
>   ...>                  from pragma_table_xinfo
>   ...>                 where schema == d.name
>   ...>                   and arg == 'x')
>   ...>  limit 1;
>two
>sqlite> create table temp.x(x);
>sqlite> insert into temp.x values (1);
>sqlite> select * from x;
>1
>sqlite> select name
>   ...>   from pragma_database_list as d
>   ...>  where exists (select *
>   ...>                  from pragma_table_xinfo
>   ...>                 where schema == d.name
>   ...>                   and arg == 'x')
>   ...>  limit 1;
>temp
>sqlite>
>
>--
>The fact that there's a Highway to Hell but only a Stairway to Heaven
>says a lot about anticipated traffic volume.
>
>>-----Original Message-----
>>From: sqlite-users <sqlite-users-boun...@mailinglists.sqlite.org> On
>>Behalf Of x
>>Sent: Monday, 20 January, 2020 01:27
>>To: SQLite mailing list <sqlite-users@mailinglists.sqlite.org>
>>Subject: Re: [sqlite] Find schema of a table in a query
>>
>>WOW Keith. That’s the sqlite coding equivalent of scoring a hat trick in
>>the world cup final. I’ve added an order by to get the solution
>>
>>select name from pragma_database_list d
>>where (select name from pragma_table_xinfo where schema==d.name and
>>arg==?1)
>>order by seq!=1, seq limit 1;
>>
>>I’m assuming the temp db is always 1 in the seq column. Can anyone
>>confirm that or should I change it to
>>
>>order by lower(name)!=temp, seq limit 1;
>>
>>Thanks. I also learned the parentheses are not required for pragma
>>functions when there’s no params and alternate syntax when they are.
>>
>>
>>________________________________
>>From: sqlite-users <sqlite-users-boun...@mailinglists.sqlite.org> on
>>behalf of Keith Medcalf <kmedc...@dessus.com>
>>Sent: Sunday, January 19, 2020 8:32:06 PM
>>To: SQLite mailing list <sqlite-users@mailinglists.sqlite.org>
>>Subject: Re: [sqlite] Find schema of a table in a query
>>
>>
>>On Sunday, 19 January, 2020 01:47, x <tam118...@hotmail.com> wrote:
>>
>>>Suppose you’re given a query ‘SELECT 1 from tbl’ by a user and you want
>>>to know the name of the schema that tbl belongs to. What’s the easiest
>>>way to do this?
>>
>>>I know sqlite will use temp.tbl if it exists else main.tbl if it exists
>>>else it will search for the earliest attached schema with a table
>called
>>>tbl. Finding that involves the use of PRAGMA database_list and then
>>>querying each of the associated sqlite_master tables in turn for the
>>>existence of tbl until you get a match. Is there an easier way?
>>
>>How about:
>>
>>select name
>>  from pragma_database_list as d
>> where (select name
>>          from pragma_table_xinfo
>>         where schema == d.name
>>           and arg == 'x') is not null;
>>
>>Where you set "arg == 'tablename'" which will return all the schema's in
>>which the specified tablename exists.
>>
>>--
>>The fact that there's a Highway to Hell but only a Stairway to Heaven
>>says a lot about anticipated traffic volume.
>>
>>
>>
>>_______________________________________________
>>sqlite-users mailing list
>>sqlite-users@mailinglists.sqlite.org
>>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>_______________________________________________
>>sqlite-users mailing list
>>sqlite-users@mailinglists.sqlite.org
>>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
>
>
>_______________________________________________
>sqlite-users mailing list
>sqlite-users@mailinglists.sqlite.org
>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to