nlextract / NLExtract

Convert (ETL) and visualize free Dutch geo-datasets.
https://nlextract.nl
GNU General Public License v3.0
153 stars 83 forks source link

ERROR: relation "nlx_bag_info" does not exist wanneer schema niet in het search path staat #341

Closed fsteggink closed 2 years ago

fsteggink commented 2 years ago

Als je een van de _actueel of _actueelbestaand views probeert te benaderen, waarbij je search_path niet is ingesteld (dus op public) staat of op iets anders waarbij het BAG v2-schema niet in het search_path staat, dan krijg je de volgende foutmelding:

db=> select bagv2.extract_datum();
ERROR:  relation "nlx_bag_info" does not exist
LINE 3:                      FROM nlx_bag_info
                                  ^
QUERY:
                   SELECT waarde::timestamp
                     FROM nlx_bag_info
                    WHERE sleutel = 'extract_datum'

CONTEXT:  SQL function "extract_datum" during inlining

Zodra je het BAG v2-schema aan het search_path toevoegt, werkt deze functie wel en daarmee ook de _actueel en _actueelbestaand views.

Is het niet robuuster om ipv deze functie een with-statement te gebruiken in de views? Of een view die de extract_datum ophaalt?

Vb:

CREATE VIEW lp2 AS
    WITH extract_datum as (
       SELECT waarde::timestamp
         FROM nlx_bag_info
        WHERE sleutel = 'extract_datum'
    )    
    SELECT * FROM ligplaats
    JOIN extract_datum ON 1=1
    WHERE
        beginDatumTijdvakGeldigheid <= extract_datum.waarde
        AND (eindDatumTijdvakGeldigheid is NULL OR eindDatumTijdvakGeldigheid >= extract_datum.waarde)
        AND aanduidingrecordinactief is FALSE
        AND ligplaatsStatus <> 'Plaats ingetrokken'::ligplaatsStatus;

db=> set search_path=public;
SET
db=> select count(*) from bagv2.lp2;
 count
-------
 12377
(1 row)

db=> select count(*) from bagv2.ligplaatsactueelbestaand;
ERROR:  relation "nlx_bag_info" does not exist
LINE 3:                      FROM nlx_bag_info
                                  ^
QUERY:
                   SELECT waarde::timestamp
                     FROM nlx_bag_info
                    WHERE sleutel = 'extract_datum'

CONTEXT:  SQL function "extract_datum" during inlining

Evt. timestamp with time zone gebruiken zoals voorgesteld in issue #340.

fsteggink commented 2 years ago

Mijn view lp2 is niet helemaal zoals het zou moeten. Het veld waarde komt in deze definitie ook terecht in de kolommen. Dat is natuurlijk niet de bedoeling. Dat is makkelijk te fixen door ligplaats.* te bevragen.

fsteggink commented 2 years ago

Gelijk maar een fix doorgevoerd, omdat ik er nu last van heb. V.w.b. performance zal dit waarschijnlijk niet beter of slechter zijn dan een functie. In onderstaand execution plan is te zien dat nlx_bag_info maar 1x wordt doorgelopen.

Query plan:

 Nested Loop  (cost=0.00..1306.94 rows=4912 width=396)
   Join Filter: ((lig.begindatumtijdvakgeldigheid <= (nlx_bag_info.waarde)::timestamp without time zone) AND ((lig.einddatumtijdvakgeldigheid IS NULL) OR (lig.einddatumtijdvakgeldigheid >= (nlx_bag_info.waarde)::timestamp without time zone)))
   ->  Seq Scan on nlx_bag_info  (cost=0.00..1.11 rows=1 width=32)
         Filter: ((sleutel)::text = 'extract_datum'::text)
   ->  Seq Scan on ligplaats lig  (cost=0.00..867.38 rows=17538 width=396)
         Filter: (aanduidingrecordinactief IS FALSE)
(6 rows)
fsteggink commented 2 years ago

De index op sleutel in nlx_bag_info wordt niet aangeroepen Ook niet als ik de tekst 'extract_datum' cast naar varchar. Waarschijnlijk omdat er slechts 9 rijen in de tabel zitten.

justb4 commented 2 years ago

Inderdaad gereproduceerd, in standaard schema bagactueel werkt de query hieronder al niet:

image

sebastic commented 2 years ago

Gebruik van het public schema wordt niet ondersteunt (#316), gebruikers moeten daarom het search_path configuren, e.g.:

ALTER ROLE <username>
IN DATABASE <database>
SET search_path TO <schema>, public; 
fsteggink commented 2 years ago

Gebruik van het public schema wordt niet ondersteunt (#316), gebruikers moeten daarom het search_path configuren, e.g.:

ALTER ROLE <username>
IN DATABASE <database>
SET search_path TO <schema>, public; 

Dat maakt het gebruik van de NLExtract database een stuk minder portable. Bij gebruik van een view heb je dat probleem niet.