ошибка assign_vertex_id

Я пытаюсь проверить, работает ли pgrouting нормально или нет. Для этого я создал таблицу, содержащую следующие атрибуты.

  Columns:
 gid      |
 length   |
 the_geom |
 source   |
 target

Теперь моя проблема в том, что когда я пытаюсь выполнить функцию assign_vertex_id, она дает мне следующую ошибку:

PL/pgSQL function "assign_vertex_id" line 15 at EXECUTE statement
ERROR:  query string argument of EXECUTE is null
CONTEXT:  PL/pgSQL function "assign_vertex_id" line 32 at EXECUTE statement

********** Error **********

ERROR: query string argument of EXECUTE is null
SQL state: 22004


Context: PL/pgSQL function "assign_vertex_id" line 32 at EXECUTE statement

Любые предложения, что это значит?


person IT_info    schedule 07.09.2012    source источник
comment
Было бы легче выяснить, если бы вы показали типы столбцов, любые индексы и ограничения (в основном, вывод \d был бы хорошим) и особенно неудачный запрос. Каким-то образом у вас есть функция, выполняющая оператор EXECUTE как динамически сгенерированный SQL, но передается строка NULL. Один из способов, которым это может произойти, — объединить ряд значений, одним из которых является NULL.   -  person kgrittn    schedule 08.09.2012


Ответы (2)


assign_vertex_id() определен как часть PGrouting в routing_topology.sql . (Выполнение \df+ assign_vertex_id также даст вам текущий исходный код.) Оператор EXECUTE в строке 32 выглядит так:

EXECUTE 'update ' || quote_ident(geom_table) || 
    ' SET source = ' || source_id || 
    ', target = ' || target_id || 
    ' WHERE ' || quote_ident(gid_cname) || ' =  ' || _r.id;

Ошибка в том, что EXECUTE вызывается с аргументом NULL. Как? Что ж, оператор SQL || означает конкатенацию, а объединение NULL в строку приводит к NULL:

=> select ('string' || null) is null;
 ?column? 
----------
 t
(1 row)

Я предполагаю, что столбец gid базовой таблицы (здесь _r.id) содержит NULL, хотя я полагаю, что это также может быть source/target_id. Исправьте это, затем добавьте ограничение, чтобы предотвратить это в будущем:

ALTER TABLE whatever ALTER COLUMN gid SET NOT NULL;
person willglynn    schedule 07.09.2012
comment
Для столбца gid уже задано ненулевое значение. Это структура таблицы; Способ CREATE TABLE (целое число gid NOT NULL, двойная точность длины, геометрия the_geom (MultiLineString, 4326), исходное целое число, целевое целое число, CONSTRAINT gid PRIMARY KEY (gid)) - person IT_info; 08.09.2012

Вы используете Postgis 2.0 и у вас есть таблица с многострочными строками?

Функции ST_StartPoint() и ST_EndPoint() больше не работают с многострочными строками (http://postgis.refractions.net/docs/ST_StartPoint.html) в Postgis 2.0. Так что скорее всего там не получится.

Вам нужно преобразовать ваши Multilinestrings в Linestrings. Подробнее об этом здесь:

person Espen    schedule 30.01.2013