Re: mysql_fdw trouble - Mailing list pgsql-general

From Adrian Klaver
Subject Re: mysql_fdw trouble
Date
Msg-id 5633A03A.5020103@aklaver.com
Whole thread Raw
In response to Re: mysql_fdw trouble  (Dane Foster <studdugie@gmail.com>)
Responses Re: mysql_fdw trouble
List pgsql-general
On 10/30/2015 09:36 AM, Dane Foster wrote:
> On Fri, Oct 30, 2015 at 12:26 PM, Adrian Klaver
> <adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>> wrote:
>
>     On 10/30/2015 08:13 AM, Dane Foster wrote:
>
>
>         On Fri, Oct 30, 2015 at 10:57 AM, Adrian Klaver
>         <adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>
>         <mailto:adrian.klaver@aklaver.com
>         <mailto:adrian.klaver@aklaver.com>>> wrote:
>
>              On 10/30/2015 07:21 AM, Dane Foster wrote:
>
>
>                  On Fri, Oct 30, 2015 at 9:40 AM, Adrian Klaver
>                  <adrian.klaver@aklaver.com
>         <mailto:adrian.klaver@aklaver.com>
>         <mailto:adrian.klaver@aklaver.com
>         <mailto:adrian.klaver@aklaver.com>>
>                  <mailto:adrian.klaver@aklaver.com
>         <mailto:adrian.klaver@aklaver.com>
>
>                  <mailto:adrian.klaver@aklaver.com
>         <mailto:adrian.klaver@aklaver.com>>>> wrote:
>
>                       On 10/29/2015 05:38 PM, Dane Foster wrote:
>
>                           Hello,
>
>                           I think I've tripped over another mysq_fdw
>         bug. I've
>                  filed a bug
>                           report
>                           on github already but just in case the problem
>         is w/ my
>                  query I
>                           figured
>                           I would post it here in case someone sees
>         something
>                  obvious.
>
>                           The error message I get is: null value in column
>                  "location" violates
>                           not-null constraint.
>
>                           The DDL is here:
>         https://github.com/EnterpriseDB/mysql_fdw/issues/71
>
>                           For the record I know top posting is a crime
>         against
>                  god and
>                           humanity
>                           but I feel justified because this post is not
>         directly
>                  related
>                           to the
>                           original. So there!  Granted it's in the same
>         milieu;
>                  and yes this
>                           current sentence exists for the sole purpose of me
>                  being able to
>                           use the
>                           word milieu because the opportunity to use it
>         is so few
>                  and far
>                           between.
>
>                           ​INSERT INTO series (cid, day, title, description,
>                  location,
>                           duration,
>                           can_join)
>                               SELECT
>                                 cid,
>                                 row_number() OVER (PARTITION BY cid ORDER BY
>                  lower(duration)),
>                                 title,
>                                 description,
>                                 location,
>                                 duration,
>                                 can_join
>                               FROM (
>                                 SELECT
>                                   cid,
>                                   title,
>                                   description,
>                                   can_join::BOOLEAN,
>                                   (SELECT label FROM _locations WHERE
>                  loc=location) AS
>                           location,
>                                   ('[' || starts || ', ' || (starts +
>         INTERVAL '4
>                  HOUR') ||
>                           ']')::TSZ_PERIOD AS duration
>                                 FROM
>                                   _series
>                               ) AS v​
>
>                           ​Regards,​
>
>
>                       So what do you get when you do?:
>
>                       SELECT
>                              cid,
>                              title,
>                              description,
>                              can_join::BOOLEAN,
>                              (SELECT label FROM _locations WHERE
>         loc=location) AS
>                  location,
>                              ('[' || starts || ', ' || (starts + INTERVAL '4
>                  HOUR') ||
>                       ']')::TSTZRANGE AS duration
>                            FROM
>                              _series
>                          );
>
>
>                           Dane
>
>
>
>
>                       --
>                       Adrian Klaver
>         adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>
>         <mailto:adrian.klaver@aklaver.com
>         <mailto:adrian.klaver@aklaver.com>>
>                  <mailto:adrian.klaver@aklaver.com
>         <mailto:adrian.klaver@aklaver.com>
>
>                  <mailto:adrian.klaver@aklaver.com
>         <mailto:adrian.klaver@aklaver.com>>>
>
>                  ​
>                  I get rows of data, location and all.
>
>
>              And when you do?:
>
>              SELECT
>                   cid,
>                   row_number() OVER (PARTITION BY cid ORDER BY
>         lower(duration)),
>                   title,
>                   description,
>                   location,
>                   duration,
>                   can_join
>                 FROM (
>                   SELECT
>                     cid,
>                     title,
>                     description,
>                     can_join::BOOLEAN,
>                     (SELECT label FROM _locations WHERE loc=location) AS
>         location,
>                     ('[' || starts || ', ' || (starts + INTERVAL '4
>         HOUR') ||
>              ']')::TSTZRANGE AS duration
>                   FROM
>                     _series
>                 ) AS v
>
>
>
>                  Dane
>                  ​
>
>
>
>              --
>              Adrian Klaver
>         adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>
>         <mailto:adrian.klaver@aklaver.com
>         <mailto:adrian.klaver@aklaver.com>>
>
>
>         ​Before I answer your second query question I need to revise my
>         response
>         to the first. Yes the first query runs w/o an error message but
>         the bit
>         about "rows and all" was not entirely correct. Out of 313 rows
>         only the
>         first row had a location. The other 312 rows have NULL in the
>         location
>         column which is not supposed to happen. To verify this I changed the
>         table names and removed the PostgreSQL transformations (i.e.,
>         use of ||
>         and :: for casting) and ran the query against the MySQL database; it
>         returned 313 rows of data, location and all.
>
>
>     You would think that would also cause an issue with the first row
>     that is returned correctly. My suspicion is with this:
>
>     row_number() OVER (PARTITION BY cid ORDER BY lower(duration))
>
>     What happens if you run the full SELECT without it?
>
>
>
>
>         Now that I've cleared that up.
>
>         Your second query also runs w/o any error messages but like the
>         first
>         only the first row has a non NULL value in the location column.
>
>
>
>         Dane
>         ​
>
>
>
>     --
>     Adrian Klaver
>     adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>
>
> ​
> Your first query didn't use it and as discussed rows come back but only
> the first row has a non NULL location column.

Forgot about that. Where I was going with this is that duration comes from:

('[' || starts || ', ' || (starts + INTERVAL '4 HOUR') ||
']')::TSTZRANGE AS duration

and MySQL and Postgres have different ideas about timestamps. While I
thinking about what that meant in the context of the query I realized I
was stepping over the obvious:

SELECT label FROM _locations WHERE loc=location

So what does the below show:

SELECT label FROM _locations, _series WHERE loc=location;

>
> Dane
> ​
>


--
Adrian Klaver
adrian.klaver@aklaver.com


pgsql-general by date:

Previous
From: Dane Foster
Date:
Subject: Re: mysql_fdw trouble
Next
From: Dane Foster
Date:
Subject: Re: mysql_fdw trouble