Интересная проблема вылезла Pg 9.5.7 - Mailing list pgsql-ru-general

From Dmitry E. Oboukhov
Subject Интересная проблема вылезла Pg 9.5.7
Date
Msg-id 20180423155636.25gn66rl4cbrun4g@vdsl.uvw.ru
Whole thread Raw
List pgsql-ru-general
Была база заказов и в ней вот такой запрос:


UPDATE
    "orders" "o"
SET

    "finish_time"   = NOW(),
    ("finish_longitude", "finish_latitude") = (
        SELECT
            ("d"."lp"->>'longitude')::NUMERIC(9,6)  AS "finish_longitude",
            ("d"."lp"->>'latitude')::NUMERIC(9,6)   AS "finish_latitude"
        FROM
            "drivers" "d"
        WHERE
            "d"."id" = "o"."did"
    ),

    "status" = 'complete'
WHERE
    "id" = '77587611'
RETURNING
  *

Есть некая возня: из другой таблички берем lon/lat и кладем в заказы.

Все работало нормально, хотя синтаксис относительно некрасивый.

Далее работаем над тем чтобы включить партицирование.

Что сделали

1. создали новую таблицу
    CREATE TABLE "porders" (LIKE "orders" INCLUDING ALL);
2. Проставили что orders теперь является inherit от porders
3. затем переименовали таблицы
    orders -> history
    porders -> orders
4. Некоторую часть заказов перенесли из history в orders запросами
вида
    WITH
        "o" AS (
            DELETE FROM "history" WHERE "id" > $1
        )
    INSERT INTO "orders" SELECT "o";


Что имеется: имеется дохрелион тестов которые тестируют каждый SQL
запрос на тестовой базе, и они все прошли. Тест данного запроса так же
нормально проходит.

Сделали апгрейд боевой БД и данный запрос стал сыпаться с ошибкой:

ERROR:  attribute 82 has wrong type
Table has type text, but query expects integer.

Экспериментальным путем вычислили что проблема вот в этом блоке:

    ("finish_longitude", "finish_latitude") = (
        SELECT
            ("d"."lp"->>'longitude')::NUMERIC(9,6)  AS "finish_longitude",
            ("d"."lp"->>'latitude')::NUMERIC(9,6)   AS "finish_latitude"
        FROM
            "drivers" "d"
        WHERE
            "d"."id" = "o"."did"
    ),

Значения finish_longitude и finish_latitude получаются 37.871355 и
55.751878.

В интернетах гуглил и чет ничего не нагуглил. Запрос пока переписали
на perl'овой стороне (то есть убрали подзапрос).

Медитирую но пока не могу понять как на такую проблему нарвались. Есть
подозрение что падает на записях которые переносили из history в
orders но пока не проверил с новыми записями.

Есть идеи как это посмотреть?
--

. ''`.            Dmitry E. Oboukhov <unera@debian.org>
: :’  :
`. `~’               GPG key: 4096R/08EEA756 2014-08-30
  `- 71ED ACFC 6801 0DD9 1AD1  9B86 8D1F 969A 08EE A756

Attachment

pgsql-ru-general by date:

Previous
From: "Dmitry E. Oboukhov"
Date:
Subject: Re: Настройка psql
Next
From: Dmitry Igrishin
Date:
Subject: Новый C++ API для PostgreSQL.