Thread: Parser Modification Problem: Get the columns of a Table

Parser Modification Problem: Get the columns of a Table

From
NK
Date:
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
 
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.

Re: Parser Modification Problem: Get the columns of a Table

From
Tom Lane
Date:
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