Skip to content

Commit 05db8d8

Browse files
Fix issue apache#975 Invalid reuse of variables in CREATE clause
- Added checks for invalid use of variables in create clause. - Fixed error position of path and node variables. - Added regression tests.
1 parent 69c275e commit 05db8d8

File tree

5 files changed

+307
-40
lines changed

5 files changed

+307
-40
lines changed

regress/expected/cypher_create.out

+136-8
Original file line numberDiff line numberDiff line change
@@ -499,25 +499,25 @@ SELECT * FROM cypher('cypher_create', $$
499499
CREATE (a {test:1})-[:e_var]->()
500500
$$) as (a agtype);
501501
ERROR: previously declared nodes in a create clause cannot have properties
502-
LINE 1: SELECT * FROM cypher('cypher_create', $$
503-
^
502+
LINE 4: CREATE (a {test:1})-[:e_var]->()
503+
^
504504
-- Var 'a' cannot change labels
505505
SELECT * FROM cypher('cypher_create', $$
506506
MATCH (a:n_var)
507507
WHERE a.name = 'Node A'
508508
CREATE (a:new_label)-[:e_var]->()
509509
$$) as (a agtype);
510510
ERROR: previously declared variables cannot have a label
511-
LINE 1: SELECT * FROM cypher('cypher_create', $$
512-
^
511+
LINE 4: CREATE (a:new_label)-[:e_var]->()
512+
^
513513
SELECT * FROM cypher('cypher_create', $$
514514
MATCH (a:n_var)-[b]-()
515515
WHERE a.name = 'Node A'
516516
CREATE (a)-[b:e_var]->()
517517
$$) as (a agtype);
518518
ERROR: variable b already exists
519-
LINE 1: SELECT * FROM cypher('cypher_create', $$
520-
^
519+
LINE 4: CREATE (a)-[b:e_var]->()
520+
^
521521
-- A valid single vertex path
522522
SELECT * FROM cypher('cypher_create', $$
523523
CREATE p=(a)
@@ -578,7 +578,7 @@ SELECT * FROM cypher('cypher_create', $$
578578
$$) as (a agtype);
579579
ERROR: label existing_elabel is for edges, not vertices
580580
LINE 2: CREATE (a:existing_elabel { id: 5})
581-
^
581+
^
582582
--
583583
-- check the cypher CREATE clause inside an INSERT INTO
584584
--
@@ -641,12 +641,137 @@ SELECT * FROM cypher('cypher_create', $$ MATCH (a:Part) RETURN a $$) as (a agtyp
641641

642642
END;
643643
--
644+
-- variable reuse
645+
--
646+
-- Valid variable reuse
647+
SELECT * FROM cypher('cypher_create', $$
648+
CREATE (p)-[a:new]->(p)
649+
RETURN p,a,p
650+
$$) as (n1 agtype, e agtype, n2 agtype);
651+
n1 | e | n2
652+
----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------
653+
{"id": 281474976710681, "label": "", "properties": {}}::vertex | {"id": 3940649673949185, "label": "new", "end_id": 281474976710681, "start_id": 281474976710681, "properties": {}}::edge | {"id": 281474976710681, "label": "", "properties": {}}::vertex
654+
(1 row)
655+
656+
SELECT * FROM cypher('cypher_create', $$
657+
CREATE (p:node)-[e:new]->(p)
658+
RETURN p,e,p
659+
$$) as (n1 agtype, e agtype, n2 agtype);
660+
n1 | e | n2
661+
---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------
662+
{"id": 4222124650659841, "label": "node", "properties": {}}::vertex | {"id": 3940649673949186, "label": "new", "end_id": 4222124650659841, "start_id": 4222124650659841, "properties": {}}::edge | {"id": 4222124650659841, "label": "node", "properties": {}}::vertex
663+
(1 row)
664+
665+
SELECT * FROM cypher('cypher_create', $$
666+
CREATE (p)
667+
CREATE (p)-[a:new]->(p)
668+
RETURN p,a,p
669+
$$) as (n1 agtype, e agtype, n2 agtype);
670+
n1 | e | n2
671+
----------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------
672+
{"id": 281474976710682, "label": "", "properties": {}}::vertex | {"id": 3940649673949187, "label": "new", "end_id": 281474976710682, "start_id": 281474976710682, "properties": {}}::edge | {"id": 281474976710682, "label": "", "properties": {}}::vertex
673+
(1 row)
674+
675+
SELECT * FROM cypher('cypher_create', $$
676+
CREATE (p:n1)
677+
CREATE (p)-[a:new]->(p)
678+
RETURN p,a,p
679+
$$) as (n1 agtype, e agtype, n2 agtype);
680+
n1 | e | n2
681+
-------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------
682+
{"id": 4503599627370497, "label": "n1", "properties": {}}::vertex | {"id": 3940649673949188, "label": "new", "end_id": 4503599627370497, "start_id": 4503599627370497, "properties": {}}::edge | {"id": 4503599627370497, "label": "n1", "properties": {}}::vertex
683+
(1 row)
684+
685+
SELECT * FROM cypher('cypher_create', $$
686+
MATCH (p:node)
687+
CREATE (p)-[a:new]->(p)
688+
RETURN p,a,p
689+
$$) as (n1 agtype, e agtype, n2 agtype);
690+
n1 | e | n2
691+
---------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------
692+
{"id": 4222124650659841, "label": "node", "properties": {}}::vertex | {"id": 3940649673949189, "label": "new", "end_id": 4222124650659841, "start_id": 4222124650659841, "properties": {}}::edge | {"id": 4222124650659841, "label": "node", "properties": {}}::vertex
693+
(1 row)
694+
695+
-- Invalid variable reuse
696+
SELECT * FROM cypher('cypher_create', $$
697+
CREATE (p)-[a:new]->(p {n0:'n1'})
698+
$$) as (a agtype);
699+
ERROR: previously declared nodes in a create clause cannot have properties
700+
LINE 2: CREATE (p)-[a:new]->(p {n0:'n1'})
701+
^
702+
SELECT * FROM cypher('cypher_create', $$
703+
CREATE (p:n0)-[a:new]->(p:n1)
704+
$$) as (a agtype);
705+
ERROR: previously declared variables cannot have a label
706+
LINE 2: CREATE (p:n0)-[a:new]->(p:n1)
707+
^
708+
SELECT * FROM cypher('cypher_create', $$
709+
CREATE p=(p)
710+
$$) as (a agtype);
711+
ERROR: variable "p" already exists
712+
LINE 2: CREATE p=(p)
713+
^
714+
SELECT * FROM cypher('cypher_create', $$
715+
CREATE p=() CREATE (p)
716+
$$) as (a agtype);
717+
ERROR: agtype must resolve to a vertex
718+
SELECT * FROM cypher('cypher_create', $$
719+
CREATE p=(a)-[p:b]->(a)
720+
$$) as (a agtype);
721+
ERROR: variable "p" already exists
722+
LINE 2: CREATE p=(a)-[p:b]->(a)
723+
^
724+
SELECT * FROM cypher('cypher_create', $$
725+
CREATE p=(a)-[:new]->(p)
726+
$$) as (a agtype);
727+
ERROR: variable "p" already exists
728+
LINE 2: CREATE p=(a)-[:new]->(p)
729+
^
730+
SELECT * FROM cypher('cypher_create', $$
731+
MATCH (p) CREATE p=()
732+
$$) as (a agtype);
733+
ERROR: variable "p" already exists
734+
LINE 2: MATCH (p) CREATE p=()
735+
^
736+
SELECT * FROM cypher('cypher_create', $$
737+
MATCH (p) CREATE p=(p)
738+
$$) as (a agtype);
739+
ERROR: variable "p" already exists
740+
LINE 2: MATCH (p) CREATE p=(p)
741+
^
742+
SELECT * FROM cypher('cypher_create', $$
743+
MATCH (p) CREATE (a)-[p:b]->(a)
744+
$$) as (a agtype);
745+
ERROR: variable p already exists
746+
LINE 2: MATCH (p) CREATE (a)-[p:b]->(a)
747+
^
748+
SELECT * FROM cypher('cypher_create', $$
749+
CREATE (a)-[e:new]->(p)-[e]->(a)
750+
$$) as (a agtype);
751+
ERROR: relationships must be specify a label in CREATE.
752+
LINE 2: CREATE (a)-[e:new]->(p)-[e]->(a)
753+
^
754+
SELECT * FROM cypher('cypher_create', $$
755+
CREATE (a)-[e:new]->(p)
756+
CREATE (p)-[e:new]->(a)
757+
$$) as (a agtype);
758+
ERROR: variable e already exists
759+
LINE 3: CREATE (p)-[e:new]->(a)
760+
^
761+
SELECT * FROM cypher('cypher_create', $$
762+
MATCH (a)-[e:new]->(p)
763+
CREATE (p)-[e:new]->(a)
764+
$$) as (a agtype);
765+
ERROR: variable e already exists
766+
LINE 3: CREATE (p)-[e:new]->(a)
767+
^
768+
--
644769
-- Clean up
645770
--
646771
DROP TABLE simple_path;
647772
DROP FUNCTION create_test;
648773
SELECT drop_graph('cypher_create', true);
649-
NOTICE: drop cascades to 13 other objects
774+
NOTICE: drop cascades to 16 other objects
650775
DETAIL: drop cascades to table cypher_create._ag_label_vertex
651776
drop cascades to table cypher_create._ag_label_edge
652777
drop cascades to table cypher_create.v
@@ -660,6 +785,9 @@ drop cascades to table cypher_create.existing_vlabel
660785
drop cascades to table cypher_create.existing_elabel
661786
drop cascades to table cypher_create.knows
662787
drop cascades to table cypher_create."Part"
788+
drop cascades to table cypher_create.new
789+
drop cascades to table cypher_create.node
790+
drop cascades to table cypher_create.n1
663791
NOTICE: graph "cypher_create" has been dropped
664792
drop_graph
665793
------------

regress/expected/cypher_match.out

+15-15
Original file line numberDiff line numberDiff line change
@@ -508,43 +508,43 @@ SELECT * FROM cypher('cypher_match', $$
508508
$$) AS (a agtype);
509509
ERROR: multiple labels for variable 'a' are not supported
510510
LINE 2: MATCH (a)-[]-()-[]-(a:v1) RETURN a
511-
^
511+
^
512512
SELECT * FROM cypher('cypher_match', $$
513513
MATCH (a)-[]-(a:v2)-[]-(a) RETURN a
514514
$$) AS (a agtype);
515515
ERROR: multiple labels for variable 'a' are not supported
516516
LINE 2: MATCH (a)-[]-(a:v2)-[]-(a) RETURN a
517-
^
517+
^
518518
SELECT * FROM cypher('cypher_match', $$
519519
MATCH (a)-[]-(a:v1) RETURN a
520520
$$) AS (a agtype);
521521
ERROR: multiple labels for variable 'a' are not supported
522522
LINE 2: MATCH (a)-[]-(a:v1) RETURN a
523-
^
523+
^
524524
SELECT * FROM cypher('cypher_match', $$
525525
MATCH (a)-[]-(a)-[]-(a:v1) RETURN a
526526
$$) AS (a agtype);
527527
ERROR: multiple labels for variable 'a' are not supported
528528
LINE 2: MATCH (a)-[]-(a)-[]-(a:v1) RETURN a
529-
^
529+
^
530530
SELECT * FROM cypher('cypher_match', $$
531531
MATCH (a)-[]-(a)-[]-(a:invalid_label) RETURN a
532532
$$) AS (a agtype);
533533
ERROR: multiple labels for variable 'a' are not supported
534534
LINE 2: MATCH (a)-[]-(a)-[]-(a:invalid_label) RETURN a
535-
^
535+
^
536536
SELECT * FROM cypher('cypher_match', $$
537537
MATCH (a) MATCH (a:v1) RETURN a
538538
$$) AS (a agtype);
539539
ERROR: multiple labels for variable 'a' are not supported
540540
LINE 2: MATCH (a) MATCH (a:v1) RETURN a
541-
^
541+
^
542542
SELECT * FROM cypher('cypher_match', $$
543543
MATCH (a) MATCH (a:invalid_label) RETURN a
544544
$$) AS (a agtype);
545545
ERROR: multiple labels for variable 'a' are not supported
546546
LINE 2: MATCH (a) MATCH (a:invalid_label) RETURN a
547-
^
547+
^
548548
SELECT * FROM cypher('cypher_match', $$
549549
MATCH (a:v1)-[]-()-[a]-() RETURN a
550550
$$) AS (a agtype);
@@ -718,8 +718,8 @@ SELECT * FROM cypher('cypher_match', $$
718718
MATCH (r1:invalid)-[]->(r1)-[]->(r1)-[]->(r1:invalids) return r1
719719
$$) AS (r1 agtype);
720720
ERROR: multiple labels for variable 'r1' are not supported
721-
LINE 2: MATCH (r1:invalid)-[]->(r1)-[]->(r1)-[]->(r1:invali...
722-
^
721+
LINE 2: ... MATCH (r1:invalid)-[]->(r1)-[]->(r1)-[]->(r1:invalid...
722+
^
723723
SELECT * FROM cypher('cypher_match', $$
724724
MATCH (r1:invalid)-[]->(r1)-[]->(r1)-[]->(r1)-[r1]->() return r1
725725
$$) AS (r1 agtype);
@@ -732,25 +732,25 @@ SELECT * FROM cypher('cypher_match', $$
732732
$$) AS (r1 agtype);
733733
ERROR: multiple labels for variable 'r1' are not supported
734734
LINE 2: MATCH (r1:e1), (r1:e2) return r1
735-
^
735+
^
736736
SELECT * FROM cypher('cypher_match', $$
737737
MATCH (r1:invalid), (r1:e2) return r1
738738
$$) AS (r1 agtype);
739739
ERROR: multiple labels for variable 'r1' are not supported
740740
LINE 2: MATCH (r1:invalid), (r1:e2) return r1
741-
^
741+
^
742742
SELECT * FROM cypher('cypher_match', $$
743743
MATCH (r1:e1), (r1:invalid) return r1
744744
$$) AS (r1 agtype);
745745
ERROR: multiple labels for variable 'r1' are not supported
746746
LINE 2: MATCH (r1:e1), (r1:invalid) return r1
747-
^
747+
^
748748
SELECT * FROM cypher('cypher_match', $$
749749
MATCH (r1:e1), (r1), (r1:invalid) return r1
750750
$$) AS (r1 agtype);
751751
ERROR: multiple labels for variable 'r1' are not supported
752752
LINE 2: MATCH (r1:e1), (r1), (r1:invalid) return r1
753-
^
753+
^
754754
SELECT * FROM cypher('cypher_match', $$
755755
MATCH (r0)-[r0]->() MATCH ()-[]->() RETURN r0
756756
$$) AS (r0 agtype);
@@ -768,7 +768,7 @@ SELECT * FROM cypher('cypher_match', $$
768768
$$) AS (r0 agtype);
769769
ERROR: variable 'r0' is for a edge
770770
LINE 2: MATCH ()-[r0]->() MATCH ()-[]->(r0) RETURN r0
771-
^
771+
^
772772
SELECT * FROM cypher('cypher_match', $$
773773
MATCH ()-[r0:e1]->() MATCH ()-[r0:e2]->() RETURN r0
774774
$$) AS (r0 agtype);
@@ -1083,7 +1083,7 @@ SELECT * FROM cypher('cypher_match',
10831083
AS (u agtype, e agtype, v agtype);
10841084
ERROR: variable `x` does not exist
10851085
LINE 2: $$MATCH (u)-[e]->(v) WHERE EXISTS((u)-[e]->(x)) RETURN u, e...
1086-
^
1086+
^
10871087
--
10881088
-- Tests for EXISTS(property)
10891089
--

regress/sql/cypher_create.sql

+86
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,92 @@ SELECT * FROM cypher('cypher_create', $$ CREATE (a:Part {part_num: '673'}) $$) a
299299
SELECT * FROM cypher('cypher_create', $$ MATCH (a:Part) RETURN a $$) as (a agtype);
300300
END;
301301

302+
--
303+
-- variable reuse
304+
--
305+
306+
-- Valid variable reuse
307+
308+
SELECT * FROM cypher('cypher_create', $$
309+
CREATE (p)-[a:new]->(p)
310+
RETURN p,a,p
311+
$$) as (n1 agtype, e agtype, n2 agtype);
312+
313+
SELECT * FROM cypher('cypher_create', $$
314+
CREATE (p:node)-[e:new]->(p)
315+
RETURN p,e,p
316+
$$) as (n1 agtype, e agtype, n2 agtype);
317+
318+
SELECT * FROM cypher('cypher_create', $$
319+
CREATE (p)
320+
CREATE (p)-[a:new]->(p)
321+
RETURN p,a,p
322+
$$) as (n1 agtype, e agtype, n2 agtype);
323+
324+
SELECT * FROM cypher('cypher_create', $$
325+
CREATE (p:n1)
326+
CREATE (p)-[a:new]->(p)
327+
RETURN p,a,p
328+
$$) as (n1 agtype, e agtype, n2 agtype);
329+
330+
SELECT * FROM cypher('cypher_create', $$
331+
MATCH (p:node)
332+
CREATE (p)-[a:new]->(p)
333+
RETURN p,a,p
334+
$$) as (n1 agtype, e agtype, n2 agtype);
335+
336+
-- Invalid variable reuse
337+
338+
SELECT * FROM cypher('cypher_create', $$
339+
CREATE (p)-[a:new]->(p {n0:'n1'})
340+
$$) as (a agtype);
341+
342+
SELECT * FROM cypher('cypher_create', $$
343+
CREATE (p:n0)-[a:new]->(p:n1)
344+
$$) as (a agtype);
345+
346+
SELECT * FROM cypher('cypher_create', $$
347+
CREATE p=(p)
348+
$$) as (a agtype);
349+
350+
SELECT * FROM cypher('cypher_create', $$
351+
CREATE p=() CREATE (p)
352+
$$) as (a agtype);
353+
354+
SELECT * FROM cypher('cypher_create', $$
355+
CREATE p=(a)-[p:b]->(a)
356+
$$) as (a agtype);
357+
358+
SELECT * FROM cypher('cypher_create', $$
359+
CREATE p=(a)-[:new]->(p)
360+
$$) as (a agtype);
361+
362+
SELECT * FROM cypher('cypher_create', $$
363+
MATCH (p) CREATE p=()
364+
$$) as (a agtype);
365+
366+
SELECT * FROM cypher('cypher_create', $$
367+
MATCH (p) CREATE p=(p)
368+
$$) as (a agtype);
369+
370+
SELECT * FROM cypher('cypher_create', $$
371+
MATCH (p) CREATE (a)-[p:b]->(a)
372+
$$) as (a agtype);
373+
374+
SELECT * FROM cypher('cypher_create', $$
375+
CREATE (a)-[e:new]->(p)-[e]->(a)
376+
$$) as (a agtype);
377+
378+
SELECT * FROM cypher('cypher_create', $$
379+
CREATE (a)-[e:new]->(p)
380+
CREATE (p)-[e:new]->(a)
381+
$$) as (a agtype);
382+
383+
SELECT * FROM cypher('cypher_create', $$
384+
MATCH (a)-[e:new]->(p)
385+
CREATE (p)-[e:new]->(a)
386+
$$) as (a agtype);
387+
302388
--
303389
-- Clean up
304390
--

0 commit comments

Comments
 (0)