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.


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.
Sun, 7 Dec 2003 19:25:06 +0000 (GMT)
=?iso-8859-7?q?NK?= <noc100@yahoo.gr>
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

Sun, 07 Dec 2003 15:10:34 -0500
Tom Lane <tgl@sss.pgh.pa.us>
Re: Parser Modification Problem: Get the columns of a Table 