GRASS 8 Programmer's Manual 8.6.0dev(2026)-8843f13794
Loading...
Searching...
No Matches
print.c
Go to the documentation of this file.
1/*****************************************************************************
2 *
3 * MODULE: SQL statement parser library
4 *
5 * AUTHOR(S): lex.l and yac.y were originally taken from unixODBC and
6 * probably written by Peter Harvey <pharvey@codebydesigns.com>,
7 * modifications and other code by Radim Blazek
8 *
9 * PURPOSE: Parse input string containing SQL statement to
10 * SQLPSTMT structure.
11 * SQL parser may be used by simple database drivers.
12 *
13 * SPDX-FileCopyrightText: 2000 GRASS Development Team
14 * SPDX-License-Identifier: GPL-2.0-or-later
15 *
16 *****************************************************************************/
17
18#include <grass/sqlp.h>
19#include <stdio.h>
20
21static void print_node(SQLPNODE *nptr, int level)
22{
23 int i;
24
25 for (i = 0; i < level; i++) {
26 fprintf(stderr, " ");
27 }
28
29 if (nptr->node_type == SQLP_NODE_EXPRESSION) {
30 fprintf(stderr, "op: %s\n", sqpOperatorName(nptr->oper));
31 if (nptr->left) {
32 print_node(nptr->left, level + 1);
33 }
34 if (nptr->right) {
35 print_node(nptr->right, level + 1);
36 }
37 }
38 else if (nptr->node_type == SQLP_NODE_VALUE) {
39 switch (nptr->value.type) {
40 case SQLP_NULL:
41 fprintf(stderr, "val: NULL\n");
42 break;
43 case SQLP_D:
44 fprintf(stderr, "val: %e\n", nptr->value.d);
45 break;
46 case SQLP_I:
47 fprintf(stderr, "val: %d\n", nptr->value.i);
48 break;
49 case SQLP_S:
50 fprintf(stderr, "val: '%s'\n", nptr->value.s);
51 break;
52 }
53 }
54 else { /* SQLP_NODE_COLUMN */
55 fprintf(stderr, "col: %s\n", nptr->column_name);
56 }
57}
58
60{
61 int i;
62
63 fprintf(stderr, "********** SQL PARSER RESULT **********\n");
64 fprintf(stderr, "INPUT: %s\n", sqlpStmt->stmt);
65 fprintf(stderr, "COMMAND: ");
66 switch (sqlpStmt->command) {
67 case (SQLP_ADD_COLUMN):
68 fprintf(stderr, "ADD COLUMN\n");
69 break;
70 case (SQLP_CREATE):
71 fprintf(stderr, "CREATE\n");
72 break;
73 case (SQLP_DROP):
74 fprintf(stderr, "DROP\n");
75 break;
76 case (SQLP_DROP_COLUMN):
77 fprintf(stderr, "DROP COLUMN\n");
78 break;
79 case (SQLP_INSERT):
80 fprintf(stderr, "INSERT\n");
81 break;
82 case (SQLP_UPDATE):
83 fprintf(stderr, "UPDATE\n");
84 break;
85 case (SQLP_SELECT):
86 fprintf(stderr, "SELECT\n");
87 break;
88 case (SQLP_DELETE):
89 fprintf(stderr, "DELETE\n");
90 break;
91 default:
92 fprintf(stderr, "UNKNOWN\n");
93 }
94
95 fprintf(stderr, "TABLE: %s\n", sqlpStmt->table);
96
97 /* columns */
98 for (i = 0; i < st->nCol; i++) {
100 fprintf(stderr, "COLUMN %2d: ", i + 1);
101 switch (sqlpStmt->ColType[i]) {
102 case (SQLP_VARCHAR):
103 fprintf(stderr, "type:varchar width:%d", sqlpStmt->ColWidth[i]);
104 break;
105 case (SQLP_INTEGER):
106 fprintf(stderr, "type:integer");
107 break;
108 case (SQLP_DOUBLE):
109 fprintf(stderr, "type:double");
110 break;
111 case (SQLP_DATE):
112 fprintf(stderr, "type:date");
113 break;
114 case (SQLP_TIME):
115 fprintf(stderr, "type:time");
116 break;
117 default:
118 fprintf(stderr, "type:unknown");
119 break;
120 }
121 fprintf(stderr, " name:%s\n", sqlpStmt->Col[i].s);
122 }
123 else {
124 fprintf(stderr, "COLUMN %2d: %s\n", i + 1, sqlpStmt->Col[i].s);
125 }
126 }
127
128 /* values */
129 for (i = 0; i < st->nVal; i++) {
130 fprintf(stderr, "VALUE %2d ", i + 1);
131 switch (sqlpStmt->Val[i].type) {
132 case (SQLP_S):
133 fprintf(stderr, "(string) : %s\n", sqlpStmt->Val[i].s);
134 break;
135 case (SQLP_I):
136 fprintf(stderr, "(integer): %d\n", sqlpStmt->Val[i].i);
137 break;
138 case (SQLP_D):
139 fprintf(stderr, "(float) : %f\n", sqlpStmt->Val[i].d);
140 break;
141 case (SQLP_NULL):
142 fprintf(stderr, "(unknown) : null\n");
143 break;
144 case (SQLP_EXPR):
145 fprintf(stderr, "(expression) :\n");
146 print_node(sqlpStmt->Val[i].expr, 0);
147 break;
148 default:
149 fprintf(stderr, "unknown\n");
150 break;
151 }
152 }
153
154 if (sqlpStmt->upperNodeptr) {
155 fprintf(stderr, "WHERE:\n");
156 print_node(sqlpStmt->upperNodeptr, 0);
157 }
158
159 if (sqlpStmt->command == SQLP_SELECT) {
160 if (sqlpStmt->orderDir) {
161 fprintf(stderr, "ORDER BY: %s %s\n", sqlpStmt->orderCol,
162 sqlpStmt->orderDir == 1 ? "ASC" : "DESC");
163 }
164 else {
165 fprintf(stderr, "ORDER BY: %s\n", sqlpStmt->orderCol);
166 }
167 }
168
169 fprintf(stderr, "***************************************\n");
170
171 return (1);
172}
char * sqpOperatorName(int)
Definition sql.c:322
struct state * st
Definition parser.c:102
int sqpPrintStmt(SQLPSTMT *st)
Definition print.c:59
#define SQLP_VARCHAR
Definition sqlp.h:51
#define SQLP_DOUBLE
Definition sqlp.h:53
#define SQLP_S
Definition sqlp.h:44
#define SQLP_INSERT
Definition sqlp.h:11
#define SQLP_D
Definition sqlp.h:46
#define SQLP_TIME
Definition sqlp.h:55
#define SQLP_NODE_VALUE
Definition sqlp.h:62
#define SQLP_ADD_COLUMN
Definition sqlp.h:15
#define SQLP_DROP
Definition sqlp.h:10
#define SQLP_NODE_EXPRESSION
Definition sqlp.h:63
#define SQLP_SELECT
Definition sqlp.h:12
#define SQLP_CREATE
Definition sqlp.h:9
#define SQLP_EXPR
Definition sqlp.h:48
#define SQLP_DATE
Definition sqlp.h:54
#define SQLP_DELETE
Definition sqlp.h:14
#define SQLP_UPDATE
Definition sqlp.h:13
#define SQLP_I
Definition sqlp.h:45
#define SQLP_NULL
Definition sqlp.h:43
#define SQLP_INTEGER
Definition sqlp.h:52
#define SQLP_DROP_COLUMN
Definition sqlp.h:16
SQLPSTMT * sqlpStmt
Definition sql.c:34
char * stmt
Definition sqlp.h:88
SQLPVALUE * Col
Definition sqlp.h:93
SQLPNODE * upperNodeptr
Definition sqlp.h:102
char * orderCol
Definition sqlp.h:103
int * ColWidth
Definition sqlp.h:95
int orderDir
Definition sqlp.h:105
int command
Definition sqlp.h:91
char table[200+1]
Definition sqlp.h:92
int * ColType
Definition sqlp.h:94
SQLPVALUE * Val
Definition sqlp.h:99
double d
Definition sqlp.h:73
char * s
Definition sqlp.h:71
struct sqlpnode * expr
Definition sqlp.h:74
int i
Definition sqlp.h:72
int type
Definition sqlp.h:70