Re: cannot restore a view after a dump

Поиск
Список
Период
Сортировка
От Marc Cousin
Тема Re: cannot restore a view after a dump
Дата
Msg-id 200804041521.52137.mcousin@sigma.fr
обсуждение исходный текст
Ответ на cannot restore a view after a dump  (Marc Cousin <mcousin@sigma.fr>)
Ответы Re: cannot restore a view after a dump  (Marc Cousin <mcousin@sigma.fr>)
Список pgsql-admin
I've forgotten to add this information :

Version :
infocentre_dte=# SELECT * from version();
                                         version
------------------------------------------------------------------------------------------
 PostgreSQL 8.3.1 on x86_64-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Debian 4.2.3-2)

It's from a x86_64 debian sid...



I've narrowed it down to a simple test case... it doesn't seem to be linked with pg_dump but with the parsing of the
query: 

SELECT DISTINCT CASE WHEN (memoire.devicenumber = '{1,2}'::text[]) THEN 2 WHEN (memoire.devicenumber = '{1}'::text[])
THEN1 ELSE NULL::integer END AS "UC-SIMM" FROM (SELECT  
winaudit_management_systeme_memoire.computer, group_array((winaudit_management_systeme_memoire.devicenumber)::text) AS
devicenumberFROM  
winaudit.winaudit_management_systeme_memoire GROUP BY winaudit_management_systeme_memoire.computer) memoire ORDER BY
CASEWHEN (memoire.devicenumber = '{1,2}'::text[])  
THEN 2 WHEN (memoire.devicenumber = '{1}'::text[]) THEN 1 ELSE NULL::integer END;
ERREUR:  pour SELECT DISTINCT, ORDER BY, les expressions doivent apparaître dans la
liste SELECT

infocentre_dte=# SET lc_messages to 'C';
SET

infocentre_dte=# SELECT DISTINCT CASE WHEN (memoire.devicenumber = '{1,2}'::text[]) THEN 2 WHEN (memoire.devicenumber =
'{1}'::text[])THEN 1 ELSE NULL::integer END  
AS "UC-SIMM" FROM (SELECT winaudit_management_systeme_memoire.computer,
group_array((winaudit_management_systeme_memoire.devicenumber)::text)AS devicenumber FROM  
winaudit.winaudit_management_systeme_memoire GROUP BY winaudit_management_systeme_memoire.computer) memoire ORDER BY
CASEWHEN (memoire.devicenumber = '{1,2}'::text[])  
THEN 2 WHEN (memoire.devicenumber = '{1}'::text[]) THEN 1 ELSE NULL::integer END;
 UC-SIMM
---------
       2

(2 rows)


The SQL is exactly the same (it's the same query I've run twice with the up arrow in psql ...)



I've continued playing with it : adding the create view works then, than after some time fails again :

infocentre_dte=# CREATE VIEW v_test_marc AS
    SELECT DISTINCT CASE WHEN (memoire.devicenumber = '{1,2}'::text[]) THEN 2 WHEN (memoire.devicenumber =
'{1}'::text[])THEN 1 ELSE NULL::integer END AS "UC-SIMM" FROM  
(SELECT winaudit_management_systeme_memoire.computer,
group_array((winaudit_management_systeme_memoire.devicenumber)::text)AS devicenumber FROM  
winaudit.winaudit_management_systeme_memoire GROUP BY winaudit_management_systeme_memoire.computer) memoire ORDER BY
CASEWHEN (memoire.devicenumber = '{1,2}'::text[])  
THEN 2 WHEN (memoire.devicenumber = '{1}'::text[]) THEN 1 ELSE NULL::integer END;
CREATE VIEW
infocentre_dte=# DROP VIEW v_test_marc ;
DROP VIEW
infocentre_dte=# CREATE VIEW v_test_marc AS
    SELECT DISTINCT CASE WHEN (memoire.devicenumber = '{1,2}'::text[]) THEN 2 WHEN (memoire.devicenumber =
'{1}'::text[])THEN 1 ELSE NULL::integer END AS "UC-SIMM" FROM  
(SELECT winaudit_management_systeme_memoire.computer,
group_array((winaudit_management_systeme_memoire.devicenumber)::text)AS devicenumber FROM  
winaudit.winaudit_management_systeme_memoire GROUP BY winaudit_management_systeme_memoire.computer) memoire ORDER BY
CASEWHEN (memoire.devicenumber = '{1,2}'::text[])  
THEN 2 WHEN (memoire.devicenumber = '{1}'::text[]) THEN 1 ELSE NULL::integer END;
CREATE VIEW
infocentre_dte=# DROP VIEW v_test_marc ;
DROP VIEW
infocentre_dte=# CREATE VIEW v_test_marc AS
    SELECT DISTINCT CASE WHEN (memoire.devicenumber = '{1,2}'::text[]) THEN 2 WHEN (memoire.devicenumber =
'{1}'::text[])THEN 1 ELSE NULL::integer END AS "UC-SIMM" FROM  
(SELECT winaudit_management_systeme_memoire.computer,
group_array((winaudit_management_systeme_memoire.devicenumber)::text)AS devicenumber FROM  
winaudit.winaudit_management_systeme_memoire GROUP BY winaudit_management_systeme_memoire.computer) memoire ORDER BY
CASEWHEN (memoire.devicenumber = '{1,2}'::text[])  
THEN 2 WHEN (memoire.devicenumber = '{1}'::text[]) THEN 1 ELSE NULL::integer END;
CREATE VIEW
infocentre_dte=# DROP VIEW v_test_marc ;
DROP VIEW
infocentre_dte=# DROP VIEW v_test_marc ;
ERROR:  view "v_test_marc" does not exist
infocentre_dte=# CREATE VIEW v_test_marc AS
    SELECT DISTINCT CASE WHEN (memoire.devicenumber = '{1,2}'::text[]) THEN 2 WHEN (memoire.devicenumber =
'{1}'::text[])THEN 1 ELSE NULL::integer END AS "UC-SIMM" FROM  
(SELECT winaudit_management_systeme_memoire.computer,
group_array((winaudit_management_systeme_memoire.devicenumber)::text)AS devicenumber FROM  
winaudit.winaudit_management_systeme_memoire GROUP BY winaudit_management_systeme_memoire.computer) memoire ORDER BY
CASEWHEN (memoire.devicenumber = '{1,2}'::text[])  
THEN 2 WHEN (memoire.devicenumber = '{1}'::text[]) THEN 1 ELSE NULL::integer END;
ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list


On Friday 04 April 2008 10:22:31 Marc Cousin wrote:
> Hi,
>
> I'm having a strange problem : I created a view in a database, and I cannot
> restore it after a pg_dump.
>
>
>
> I'm creating this view :
>
> CREATE VIEW vj_icsi_integration_winaudit_isiparc AS
> SELECT DISTINCT objet.c_barre                   ,
>         resume.computer                         ,
>         resume.site                             ,
>         (resume.loctime)::DATE
>                                     AS "DATEINVENLOG",
> resume.operatingsystem
>                             AS "UC-SE"       , systeme.servicepack
>
> AS "UC-SEVERS"   , processeurs.nbprocessor
>                                                AS "UC-CPUNB"    ,
> resume.processordescription
>                             AS "UC-CPUTYP"   ,
> (((processeurs.speedregistry)::DOUBLE PRECISION / (1024)::DOUBLE PRECISION)
> / (1024)::DOUBLE PRECISION) AS "UC-CPUVIT"   , disques.disknumber
>
> AS "UC-DDNB"     , ROUND(((((resume.totalharddrive / 1024) / 1024) /
> 1024))::DOUBLE PRECISION)                             AS "UC-DDESP"    ,
> CASE
>                 WHEN (memoire.devicenumber = '{1,2,3,4,5,6}'::text[])
>                 THEN 6
>                 WHEN (memoire.devicenumber = '{1,2,3,4,5}'::text[])
>                 THEN 5
>                 WHEN (memoire.devicenumber = '{1,2,3,4}'::text[])
>                 THEN 4
>                 WHEN (memoire.devicenumber = '{1,2,3}'::text[])
>                 THEN 3
>                 WHEN (memoire.devicenumber = '{1,2}'::text[])
>                 THEN 2
>                 WHEN (memoire.devicenumber = '{1}'::text[])
>                 THEN 1
>                 ELSE NULL::INTEGER
>         END                                  AS "UC-SIMM"  ,
>         ((resume.totalmemory / 1024) / 1024) AS "UC-RAM"   ,
>         reseau.ipaddress[1]                  AS "UC-CRIP"  ,
>         reseau.ipaddress[2]                  AS "UC-CRIP_1",
>         reseau.ipaddress[3]                  AS "UC-CRIP_2",
>         CASE
>                 WHEN (reseau.dhcpipaddress IS NOT NULL)
>                 THEN 'oui'::text
>                 ELSE 'non'::text
>         END AS "UC-DHCP"
> FROM ((((((winaudit.winaudit_resum_systeme resume
>         JOIN winaudit.winaudit_systeme_exploitation systeme
>         ON ((resume.computer = systeme.computer)))
>         JOIN
>                 (SELECT winaudit_reseau.computer
> , group_array(winaudit_reseau.ipaddress)              AS ipaddress,
> group_concat_virgule(winaudit_reseau.dhcpipaddress) AS dhcpipaddress FROM
>  winaudit.winaudit_reseau
>                 GROUP BY winaudit_reseau.computer
>                 ) reseau
>         ON ((resume.computer = reseau.computer)))
>         JOIN
>                 (SELECT winaudit_processeurs.computer
>         , MAX(winaudit_processeurs.processornumber)   AS processornumber,
> COUNT(winaudit_processeurs.processornumber) AS nbprocessor    ,
> MAX(winaudit_processeurs.speedregistry)     AS speedregistry FROM
> winaudit.winaudit_processeurs
>                 GROUP BY winaudit_processeurs.computer
>                 ) processeurs
>         ON ((resume.computer = processeurs.computer)))
>         JOIN
>                 (SELECT winaudit_management_systeme_memoire.computer,
>
> group_array((winaudit_management_systeme_memoire.devicenumber)::text) AS
> devicenumber FROM    winaudit.winaudit_management_systeme_memoire GROUP BY
> winaudit_management_systeme_memoire.computer ) memoire
>         ON ((resume.computer = memoire.computer)))
>         JOIN
>                 (SELECT winaudit_disques_physiques.computer,
>                         COUNT(winaudit_disques_physiques.disknumber) AS
> disknumber FROM    winaudit.winaudit_disques_physiques
>                 GROUP BY winaudit_disques_physiques.computer
>                 ) disques
>         ON ((resume.computer = disques.computer)))
>         LEFT JOIN isilog.objet
>         ON ((resume.computername = (objet.i_ob_nom)::text)))
> ORDER BY objet.c_barre
>                                    , resume.computer
>                                                                 ,
> resume.site
>                            , (resume.loctime)::DATE
>                                                         ,
> resume.operatingsystem
>                            , systeme.servicepack
>                                                         ,
> processeurs.nbprocessor
>                            , resume.processordescription
>                                                         ,
> (((processeurs.speedregistry)::DOUBLE PRECISION / (1024)::DOUBLE PRECISION)
> / (1024)::DOUBLE PRECISION), disques.disknumber
>                                                         ,
> ROUND(((((resume.totalharddrive / 1024) / 1024) / 1024))::DOUBLE PRECISION)
>                            , CASE
>                 WHEN (memoire.devicenumber = '{1,2,3,4,5,6}'::text[])
>                 THEN 6
>                 WHEN (memoire.devicenumber = '{1,2,3,4,5}'::text[])
>                 THEN 5
>                 WHEN (memoire.devicenumber = '{1,2,3,4}'::text[])
>                 THEN 4
>                 WHEN (memoire.devicenumber = '{1,2,3}'::text[])
>                 THEN 3
>                 WHEN (memoire.devicenumber = '{1,2}'::text[])
>                 THEN 2
>                 WHEN (memoire.devicenumber = '{1}'::text[])
>                 THEN 1
>                 ELSE NULL::INTEGER
>         END                                 ,
>         ((resume.totalmemory / 1024) / 1024),
>         reseau.ipaddress[1]                 ,
>         reseau.ipaddress[2]                 ,
>         reseau.ipaddress[3]                 ,
>         CASE
>                 WHEN (reseau.dhcpipaddress IS NOT NULL)
>                 THEN 'oui'::text
>                 ELSE 'non'::text
>         END;
>
> (I know it's ugly, but the source database is ugly too :( )
>
>
> Here's the result from \d on this view :
>
>  SELECT DISTINCT objet.c_barre, resume.computer, resume.site,
> resume.loctime::date AS "DATEINVENLOG", resume.operatingsystem AS "UC-SE",
> systeme.servicepack AS "UC-SEVERS", processeurs.nbprocessor AS "UC-CPUNB",
> resume.processordescription AS "UC-CPUTYP",
> processeurs.speedregistry::double precision / 1024::double precision /
> 1024::double precision AS "UC-CPUVIT", disques.disknumber AS "UC-DDNB",
> round((resume.totalharddrive / 1024 / 1024 / 1024)::double precision) AS
> "UC-DDESP", CASE
>             WHEN memoire.devicenumber = '{1,2,3,4,5,6}'::text[] THEN 6
>             WHEN memoire.devicenumber = '{1,2,3,4,5}'::text[] THEN 5
>             WHEN memoire.devicenumber = '{1,2,3,4}'::text[] THEN 4
>             WHEN memoire.devicenumber = '{1,2,3}'::text[] THEN 3
>             WHEN memoire.devicenumber = '{1,2}'::text[] THEN 2
>             WHEN memoire.devicenumber = '{1}'::text[] THEN 1
>             ELSE NULL::integer
>         END AS "UC-SIMM", resume.totalmemory / 1024 / 1024 AS "UC-RAM",
> reseau.ipaddress[1] AS "UC-CRIP", reseau.ipaddress[2] AS "UC-CRIP_1",
> reseau.ipaddress[3] AS "UC-CRIP_2", CASE
>             WHEN reseau.dhcpipaddress IS NOT NULL THEN 'oui'::text
>             ELSE 'non'::text
>         END AS "UC-DHCP"
>    FROM winaudit_resum_systeme resume
>    JOIN winaudit_systeme_exploitation systeme ON resume.computer =
> systeme.computer JOIN ( SELECT winaudit_reseau.computer,
> group_array(winaudit_reseau.ipaddress) AS ipaddress,
> group_concat_virgule(winaudit_reseau.dhcpipaddress) AS dhcpipaddress FROM
> winaudit_reseau
>      GROUP BY winaudit_reseau.computer) reseau ON resume.computer =
> reseau.computer JOIN ( SELECT winaudit_processeurs.computer,
> max(winaudit_processeurs.processornumber) AS processornumber,
> count(winaudit_processeurs.processornumber) AS nbprocessor,
> max(winaudit_processeurs.speedregistry) AS speedregistry
>    FROM winaudit_processeurs
>   GROUP BY winaudit_processeurs.computer) processeurs ON resume.computer =
> processeurs.computer JOIN ( SELECT
> winaudit_management_systeme_memoire.computer,
> group_array(winaudit_management_systeme_memoire.devicenumber::text) AS
> devicenumber FROM winaudit_management_systeme_memoire
>   GROUP BY winaudit_management_systeme_memoire.computer) memoire ON
> resume.computer = memoire.computer JOIN ( SELECT
> winaudit_disques_physiques.computer,
> count(winaudit_disques_physiques.disknumber) AS disknumber FROM
> winaudit_disques_physiques
>   GROUP BY winaudit_disques_physiques.computer) disques ON resume.computer
> = disques.computer LEFT JOIN objet ON resume.computername =
> objet.i_ob_nom::text
>   ORDER BY objet.c_barre, resume.computer, resume.site,
> resume.loctime::date, resume.operatingsystem, systeme.servicepack,
> processeurs.nbprocessor, resume.processordescription,
> processeurs.speedregistry::double precision / 1024::double precision /
> 1024::double precision, disques.disknumber, round((resume.totalharddrive /
> 1024 / 1024 / 1024)::double precision), CASE
>     WHEN memoire.devicenumber = '{1,2,3,4,5,6}'::text[] THEN 6
>     WHEN memoire.devicenumber = '{1,2,3,4,5}'::text[] THEN 5
>     WHEN memoire.devicenumber = '{1,2,3,4}'::text[] THEN 4
>     WHEN memoire.devicenumber = '{1,2,3}'::text[] THEN 3
>     WHEN memoire.devicenumber = '{1,2}'::text[] THEN 2
>     WHEN memoire.devicenumber = '{1}'::text[] THEN 1
>     ELSE NULL::integer
> END, resume.totalmemory / 1024 / 1024, reseau.ipaddress[1],
> reseau.ipaddress[2], reseau.ipaddress[3], CASE
>     WHEN reseau.dhcpipaddress IS NOT NULL THEN 'oui'::text
>     ELSE 'non'::text
> END;
>
>
> Notice postgreSQL added an order by ...
>
> pg_dump gives me this :
>
> CREATE VIEW vj_icsi_integration_winaudit_isiparc AS
>     SELECT DISTINCT objet.c_barre, resume.computer, resume.site,
> (resume.loctime)::date AS "DATEINVENLOG", resume.operatingsystem AS
> "UC-SE", systeme.servicepack AS "UC-SEVERS", processeurs.nbprocessor AS
> "UC-CPUNB", resume.processordescription AS "UC-CPUTYP",
> (((processeurs.speedregistry)::double precision / (1024)::double precision)
> / (1024)::double precision) AS "UC-CPUVIT", disques.disknumber AS
> "UC-DDNB", round(((((resume.totalharddrive / 1024) / 1024) / 1024))::double
> precision) AS "UC-DDESP", CASE WHEN (memoire.devicenumber =
> '{1,2,3,4,5,6}'::text[]) THEN 6 WHEN (memoire.devicenumber =
> '{1,2,3,4,5}'::text[]) THEN 5 WHEN (memoire.devicenumber =
> '{1,2,3,4}'::text[]) THEN 4 WHEN (memoire.devicenumber = '{1,2,3}'::text[])
> THEN 3 WHEN (memoire.devicenumber = '{1,2}'::text[]) THEN 2 WHEN
> (memoire.devicenumber = '{1}'::text[]) THEN 1 ELSE NULL::integer END AS
> "UC-SIMM", ((resume.totalmemory / 1024) / 1024) AS "UC-RAM",
> reseau.ipaddress[1] AS "UC-CRIP", reseau.ipaddress[2] AS "UC-CRIP_1",
> reseau.ipaddress[3] AS "UC-CRIP_2", CASE WHEN (reseau.dhcpipaddress IS NOT
> NULL) THEN 'oui'::text ELSE 'non'::text END AS "UC-DHCP" FROM
> ((((((winaudit.winaudit_resum_systeme resume JOIN
> winaudit.winaudit_systeme_exploitation systeme ON ((resume.computer =
> systeme.computer))) JOIN (SELECT winaudit_reseau.computer,
> group_array(winaudit_reseau.ipaddress) AS ipaddress,
> group_concat_virgule(winaudit_reseau.dhcpipaddress) AS dhcpipaddress FROM
> winaudit.winaudit_reseau GROUP BY winaudit_reseau.computer) reseau ON
> ((resume.computer = reseau.computer))) JOIN (SELECT
> winaudit_processeurs.computer, max(winaudit_processeurs.processornumber) AS
> processornumber, count(winaudit_processeurs.processornumber) AS
> nbprocessor, max(winaudit_processeurs.speedregistry) AS speedregistry FROM
> winaudit.winaudit_processeurs GROUP BY winaudit_processeurs.computer)
> processeurs ON ((resume.computer = processeurs.computer))) JOIN (SELECT
> winaudit_management_systeme_memoire.computer,
> group_array((winaudit_management_systeme_memoire.devicenumber)::text) AS
> devicenumber FROM winaudit.winaudit_management_systeme_memoire GROUP BY
> winaudit_management_systeme_memoire.computer) memoire ON ((resume.computer
> = memoire.computer))) JOIN (SELECT winaudit_disques_physiques.computer,
> count(winaudit_disques_physiques.disknumber) AS disknumber FROM
> winaudit.winaudit_disques_physiques GROUP BY
> winaudit_disques_physiques.computer) disques ON ((resume.computer =
> disques.computer))) LEFT JOIN isilog.objet ON ((resume.computername =
> (objet.i_ob_nom)::text))) ORDER BY objet.c_barre, resume.computer,
> resume.site, (resume.loctime)::date, resume.operatingsystem,
> systeme.servicepack, processeurs.nbprocessor, resume.processordescription,
> (((processeurs.speedregistry)::double precision / (1024)::double precision)
> / (1024)::double precision), disques.disknumber,
> round(((((resume.totalharddrive / 1024) / 1024) / 1024))::double
> precision), CASE WHEN (memoire.devicenumber = '{1,2,3,4,5,6}'::text[]) THEN
> 6 WHEN (memoire.devicenumber = '{1,2,3,4,5}'::text[]) THEN 5 WHEN
> (memoire.devicenumber = '{1,2,3,4}'::text[]) THEN 4 WHEN
> (memoire.devicenumber = '{1,2,3}'::text[]) THEN 3 WHEN
> (memoire.devicenumber = '{1,2}'::text[]) THEN 2 WHEN (memoire.devicenumber
> = '{1}'::text[]) THEN 1 ELSE NULL::integer END, ((resume.totalmemory /
> 1024) / 1024), reseau.ipaddress[1], reseau.ipaddress[2],
> reseau.ipaddress[3], CASE WHEN (reseau.dhcpipaddress IS NOT NULL) THEN
> 'oui'::text ELSE 'non'::text END;
>
> And when I try to restore it, here's what I've got :
>
> ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select
> list
>
>
>
>
> I'm a bit lost on this ...
>
> Can anyone provide some help ?
>
> Thanks a lot ...



В списке pgsql-admin по дате отправления:

Предыдущее
От: Sonia Perez Peña
Дата:
Сообщение: RV: instalacion del PHPPGADMIN
Следующее
От: Shane Ambler
Дата:
Сообщение: Re: store different tables in different locations