Parser Modification Problem: Get the columns of a Table

Started by NKover 22 years ago2 messageshackers
Jump to latest
#1NK
noc100@yahoo.gr

Dear Friends,

I am trying to modify the parser of the postgresql so as to print all the columns of a table (or to put them in a seperate file) when the parser meets an Insert Statement.
In the <gram.y> file (/src/backend/parser/gram.y) ,

InsertStmt:
INSERT INTO qualified_name insert_rest
{
$4->relation = $3;
$$ = (Node *) $4;
}
;
I can take the table name adding the following line of code

printf($3->relname);

The problem is that in the insert_column_item section (see the last section below) the var n is of type ResTarget and in case of insert and select the ResTarget->Name is null and not the name of the column (in the update command everything is ok- see also the line 371 in the file parsenodes.h ...typedef struct ResTarget {....} ). Could you please tell me the way to take the names of the columns?

Every answer will be appreciated
Thank You Very Much In Advance
NK
noc100@yahoo.gr

insert_rest:
VALUES '(' insert_target_list ')'
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
$$->targetList = $3;
$$->selectStmt = NULL;
}
| DEFAULT VALUES
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
$$->targetList = NIL;
$$->selectStmt = NULL;
}
| SelectStmt
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
$$->targetList = NIL;
$$->selectStmt = $1;
}
| '(' insert_column_list ')' VALUES '(' insert_target_list ')'
{
$$ = makeNode(InsertStmt);
$$->cols = $2;
$$->targetList = $6;
$$->selectStmt = NULL;
}
| '(' insert_column_list ')' SelectStmt
{
$$ = makeNode(InsertStmt);
$$->cols = $2;
$$->targetList = NIL;
$$->selectStmt = $4;
}
;
insert_column_list:
insert_column_item { $$ = makeList1($1); }
| insert_column_list ',' insert_column_item
{ $$ = lappend($1, $3); }
;
insert_column_item:
ColId opt_indirection
{
ResTarget *n = makeNode(ResTarget);
n->name = $1;
n->indirection = $2;
n->val = NULL;
$$ = (Node *)n;
}
;

---------------------------------
Do You Yahoo!?
οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½@yahoo.gr οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ οΏ½οΏ½οΏ½ Yahoo! Mail.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: NK (#1)
Re: Parser Modification Problem: Get the columns of a Table

=?iso-8859-7?q?NK?= <noc100@yahoo.gr> writes:

Could you please tell me the way to take the names of the columns?

There is no way to do that in the grammar, because it doesn't have the
information available.

You could probably modify the insert-statement processing in analyze.c
to print out the column names, once it's matched up the raw parse tree
with information from the system catalogs.

regards, tom lane