Line data Source code
1 : #include <stdlib.h>
2 : #include <string.h>
3 : #include <stdio.h>
4 :
5 : exec sql include ../regression;
6 :
7 : exec sql whenever sqlerror sqlprint;
8 :
9 : int
10 2 : main(void)
11 : {
12 : exec sql begin declare section;
13 : char command[512];
14 : char search_address[10];
15 : char cname[100];
16 : int reg;
17 : exec sql end declare section;
18 :
19 2 : ECPGdebug(1, stderr);
20 :
21 2 : exec sql connect to REGRESSDB1 as main;
22 2 :
23 : /* Create schema and tables for property graph testing */
24 2 : exec sql create schema graph_ecpg_tests;
25 2 : exec sql set search_path = graph_ecpg_tests;
26 2 :
27 2 : exec sql create table customers (
28 : customer_id integer primary key,
29 : name varchar,
30 : address varchar
31 : );
32 2 :
33 2 : exec sql create table orders (
34 : order_id integer primary key,
35 : register integer
36 : );
37 2 :
38 2 : exec sql create table customer_orders (
39 : customer_orders_id integer primary key,
40 : customer_id integer references customers (customer_id),
41 : order_id integer references orders (order_id)
42 : );
43 2 :
44 : /* Insert test data */
45 2 : exec sql insert into customers values (1, 'customer1', 'US'), (2, 'customer2', 'CA'), (3, 'customer3', 'GL');
46 2 : exec sql insert into orders values (1, 100), (2, 200), (3, 500);
47 2 : exec sql insert into customer_orders (customer_orders_id, customer_id, order_id) values (1, 1, 1), (2, 2, 2), (3, 3, 3);
48 2 :
49 : /* Create property graph */
50 2 : exec sql create property graph shopgraph
51 : vertex tables (
52 : customers,
53 : orders
54 : )
55 : edge tables (
56 : customer_orders key (customer_orders_id)
57 : source key (customer_id) references customers (customer_id)
58 : destination key (order_id) references orders (order_id)
59 : );
60 2 :
61 2 : exec sql commit;
62 2 :
63 : /* direct sql - US customers */
64 2 : exec sql select * into :cname, :reg from graph_table (shopgraph match (c is customers where c.address = 'US')-[is customer_orders]->(o is orders) columns (c.name, o.register));
65 2 : printf("found %ld results (%s, %d)\n", sqlca.sqlerrd[2], cname, reg);
66 :
67 : /* direct sql with C variable - GL customers */
68 2 : strcpy(search_address, "GL");
69 2 : exec sql select * into :cname, :reg from graph_table (shopgraph match (c is customers where c.address = :search_address)-[is customer_orders]->(o is orders) columns (c.name, o.register));
70 2 : printf("found %ld results (%s, %d)\n", sqlca.sqlerrd[2], cname, reg);
71 :
72 : /* prepared statement - CA customers */
73 2 : sprintf(command, "select * from graph_table (shopgraph match (c is customers where c.address = $1)-[is customer_orders]->(o is orders) columns (c.name, o.register))");
74 2 : exec sql prepare graph_stmt from :command;
75 2 : strcpy(search_address, "CA");
76 2 : exec sql execute graph_stmt into :cname, :reg using :search_address;
77 2 : printf("found %ld results (%s, %d)\n", sqlca.sqlerrd[2], cname, reg);
78 2 : exec sql deallocate graph_stmt;
79 2 :
80 : /* cursor test - all customers with orders */
81 : exec sql declare graph_cursor cursor for select * from graph_table (shopgraph match (c is customers)-[is customer_orders]->(o is orders) columns (c.name, o.register)) order by name;
82 2 : exec sql open graph_cursor;
83 2 : exec sql whenever not found do break;
84 : while (1) {
85 8 : exec sql fetch graph_cursor into :cname, :reg;
86 8 : printf("cursor result: %s, %d\n", cname, reg);
87 : }
88 : exec sql whenever not found continue;
89 2 : exec sql close graph_cursor;
90 2 :
91 : /* label disjunction syntax test */
92 2 : exec sql select * into :cname from graph_table (shopgraph match (c is customers | customers where c.address = 'US') columns (c.name));
93 2 : printf("found %ld results (%s)\n", sqlca.sqlerrd[2], cname);
94 :
95 : /* Clean up */
96 2 : exec sql drop property graph shopgraph;
97 2 : exec sql drop table customer_orders;
98 2 : exec sql drop table orders;
99 2 : exec sql drop table customers;
100 2 : exec sql drop schema graph_ecpg_tests;
101 2 : exec sql commit;
102 2 : exec sql disconnect;
103 2 :
104 2 : return 0;
105 : }
|