From: | "Matthias Lenz" <ml134883(at)inf(dot)tu-dresden(dot)de> |
---|---|
To: | <pgsql-novice(at)postgresql(dot)org> |
Subject: | Re: Changing a relation's name in parser stage |
Date: | 2004-05-13 11:10:08 |
Message-ID: | 000601c438da$dc694910$9100a8c0@noctuaeeprwinl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-novice |
Hello,
Firstly, thanks to Tom Lane! I mixed up the definitions of lfirst() and
nth() relating to "i". Now, I also create a new structure below
stmt->FromClause filling up with RangeVars!
But there's another problem. I try to get the second part of new relations'
names (evey name is a composite of s_GroupAttrName) from the GroupClause
via:
ch2=((Value *) nth(0,(((ColumnRef *) nth((i/2),
stmt->groupClause))->fields)))->val.str;
that works fine, i is a running variable, decreasing in steps of one from
(2*length(stmt->GroupClause))-1. Then I have to append the "String" pointed
to to another prepared one:
((RangeVar *) nth(0, arg[i]->fromClause))->relname = strncat(t[i],ch2,1);
that works fine, too! By the way, char *ch2.
BUT, I have to append all the grouping attributes' names to as many "s_". So
i thought using char *ch[10] would by a nice idea.
ch[i]=((Value *) nth(0,(((ColumnRef *) nth((i/2),
stmt->groupClause))->fields)))->val.str;
((RangeVar *) nth(0, arg[i]->fromClause))->relname = strncat(t[i],ch[i],1);
But I only get answers like relation "nnxa>nl" does not exist. There should
be a problem with adresses, but where?
Parts of the non working code:
static SelectStmt *modifyApproxStmt(ApproxStmt *stmt)
{
SelectStmt *arg[8];
char *ch[10];
int count,i;
char t[][4]={"s_","s_","s_"};
count=length(stmt->groupClause);
i=(2*count)-1;
while(i+1>0)
{
if (i==(2*count)-1)
{
arg[i] = makeNode(SelectStmt);
arg[i]->op = SETOP_NONE;
arg[i]->all = FALSE;
arg[i]->targetList = stmt->targetList;
arg[i]->fromClause = makeList1(makeNode(RangeVar));
((RangeVar *) nth(0, arg[i]->fromClause))->inhOpt = INH_DEFAULT;
((RangeVar *) nth(0, arg[i]->fromClause))->alias = NULL;
((RangeVar *) nth(0, arg[i]->fromClause))->schemaname = NULL;
((RangeVar *) nth(0, arg[i]->fromClause))->relname = "s_overall";
arg[i]->groupClause = stmt->groupClause;
};
if ((i % 2) ==0)
{
arg[i] = makeNode(SelectStmt);
arg[i]->op = SETOP_NONE;
arg[i]->all = FALSE;
arg[i]->targetList = stmt->targetList;
arg[i]->fromClause = makeList1(makeNode(RangeVar));
((RangeVar *) nth(0, arg[i]->fromClause))->inhOpt = INH_DEFAULT;
((RangeVar *) nth(0, arg[i]->fromClause))->alias = NULL;
((RangeVar *) nth(0, arg[i]->fromClause))->schemaname = NULL;
ch[i]=((Value *) nth(0,(((ColumnRef *) nth((i/2),
stmt->groupClause))->fields)))->val.str;
((RangeVar *) nth(0, arg[i]->fromClause))->relname =
strncat(t[i],ch[i],1);
arg[i]->groupClause = stmt->groupClause;
};
...
working code:
static SelectStmt *modifyApproxStmt(ApproxStmt *stmt)
{
SelectStmt *arg[8];
char *ch,*ch2;
int count,i;
char t[][4]={"s_","s_","s_"};
/*char u[2][2];
ch=&u[0];
ch2=&u[1];*/
count=length(stmt->groupClause);
i=(2*count)-1;
/*printf(count);*/
while(i+1>0)
{
if (i==(2*count)-1)
{
arg[i] = makeNode(SelectStmt);
arg[i]->op = SETOP_NONE;
arg[i]->all = FALSE;
arg[i]->targetList = stmt->targetList;
arg[i]->fromClause = makeList1(makeNode(RangeVar));
((RangeVar *) nth(0, arg[i]->fromClause))->inhOpt = INH_DEFAULT;
((RangeVar *) nth(0, arg[i]->fromClause))->alias = NULL;
((RangeVar *) nth(0, arg[i]->fromClause))->schemaname = NULL;
((RangeVar *) nth(0, arg[i]->fromClause))->relname = "s_overall";
arg[i]->groupClause = stmt->groupClause;
};
if ((i % 2) ==0)
{
arg[i] = makeNode(SelectStmt);
arg[i]->op = SETOP_NONE;
arg[i]->all = FALSE;
arg[i]->targetList = stmt->targetList;
arg[i]->fromClause = makeList1(makeNode(RangeVar));
((RangeVar *) nth(0, arg[i]->fromClause))->inhOpt = INH_DEFAULT;
((RangeVar *) nth(0, arg[i]->fromClause))->alias = NULL;
((RangeVar *) nth(0, arg[i]->fromClause))->schemaname = NULL;
if (i==2) {
ch2=((Value *) nth(0,(((ColumnRef *) nth((i/2),
stmt->groupClause))->fields)))->val.str;
((RangeVar *) nth(0, arg[i]->fromClause))->relname = strncat(t[i],ch2,1);
}
else {
ch=((Value *) nth(0,(((ColumnRef *) nth((i/2),
stmt->groupClause))->fields)))->val.str;
((RangeVar *) nth(0, arg[i]->fromClause))->relname = strncat(t[i],ch,1);
};
arg[i]->groupClause = stmt->groupClause;
};
....
Thank you for ideas!
----- Original Message -----
From: "Tom Lane" <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: "Matthias Lenz" <ml134883(at)inf(dot)tu-dresden(dot)de>
Cc: <pgsql-novice(at)postgresql(dot)org>
Sent: Tuesday, May 11, 2004 1:43 AM
Subject: Re: [NOVICE] Changing a relation's name in parser stage
> "Matthias Lenz" <ml134883(at)inf(dot)tu-dresden(dot)de> writes:
> > List *i;
> > i=nth(1, stmt->fromClause);
> > ((RangeVar *) lfirst(i))->relname = "s_overall";
>
> nth() is going to give you a list element, not a List*. So you don't
> want the lfirst() call. I'm also dubious about whether you didn't mean
> nth(0, stmt->fromClause) --- nth() counts from zero not one. Finally,
> it seems extremely fragile to assume that fromClause entries are
> necessarily RangeVars without checking. There are other node types that
> could be there.
>
> regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org
From | Date | Subject | |
---|---|---|---|
Next Message | Rajan Bhide | 2004-05-14 09:57:18 | Should I keep INDEX on the table? |
Previous Message | Stephan Szabo | 2004-05-12 21:51:52 | Re: ORDER BY and Unicode |