Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > pgsql.general > #95 > unrolled thread
| Started by | Yessica Brinkmann <brinkmann.yessica@gmail.com> |
|---|---|
| First post | 2020-09-15 20:14 -0700 |
| Last post | 2020-09-15 21:28 -0700 |
| Articles | 2 — 1 participant |
Back to article view | Back to pgsql.general
Problems with MemoryContextSwitchTo () Yessica Brinkmann <brinkmann.yessica@gmail.com> - 2020-09-15 20:14 -0700
Re: Problems with MemoryContextSwitchTo () Yessica Brinkmann <brinkmann.yessica@gmail.com> - 2020-09-15 21:28 -0700
| From | Yessica Brinkmann <brinkmann.yessica@gmail.com> |
|---|---|
| Date | 2020-09-15 20:14 -0700 |
| Subject | Problems with MemoryContextSwitchTo () |
| Message-ID | <edea5da9-897e-45ee-979b-3f8cd28067c2n@googlegroups.com> |
Hello.
I think several of you will already remember me. I'm the one with the IndexAdviser topic. Only that I changed my email address.
As you may recall, I am doing my thesis on the subject of IndexAdviser modifications.
I really appreciate the help they have given me in various Postgresql groups.
Well, I was really nearing the end of the programming part of the thesis, when I had a problem to be able to compile my program in a moment, and by accident some lines of source code were moved.
And for this reason, I think I have problems again with the context switch issue, since at some point my context switch stopped working for me, I think because of the issue that some lines of source code were moved.
Well, the fact is that I have a function called get_columnnames, which in the second foreach, is printing the values of idxcd-> varattnnames [i] the null value.
This second foreach, I only do it to test if the data is really saved well and if I can recover it properly.
And since the data is not retrieved properly, or is not saved properly, in the following functions of my program, the value of idxcd-> varattnnames [i] continues to appear as null.
I will appreciate a lot please help, if you can tell me please why the function prints null in the values of idxcd-> varattnnames [i], in the second foreach, if it is due to an error in the context switch, or why it could be .
Best regards,
Yessica Brinkmann.
Below I write my function:
static List*
get_columnnames( List* candidates )
{
int proc;
int ret;
StringInfoData query; /* string for Query */
StringInfoData cols; /* string for Columns */
MemoryContext outerContext;
ListCell *cell;
IndexCandidate* idxcd;
elog( DEBUG3, "IND ADV: get_column_names: ENTER" );
initStringInfo( &query );
initStringInfo( &cols );
foreach( cell, candidates ) /* foreach cell in candidates */
{
int i;
/*elog (INFO, "Ingresando a foreach");*/
idxcd = (IndexCandidate*)lfirst( cell );
if (idxcd == NULL) {
elog( INFO, "idxcd IS NULL" );
continue; /* Or is that fatal enough to break instead? */
}
if (!idxcd->idxused)
continue;
/* pfree() the memory allocated for the previous candidate. FIXME: Avoid
* meddling with the internals of a StringInfo, and try to use an API.
*/
if( cols.len > 0 )
{
initStringInfo(&cols);
} /*IF col.len>0*/
if( query.len > 0 )
{
initStringInfo(&query);
} /*IF col.len>0*/
elog(INFO,"reloid:%d", idxcd->reloid);
appendStringInfo( &query, "select a.attname from pg_class c,pg_attribute a where c.oid=%d AND a.attrelid = c.oid AND (", idxcd->reloid);
/*elog(INFO,"QUERY:%s", query.data);*/
/*elog(INFO,"ncols:%d", idxcd->ncols);*/
for (i = 0; i < idxcd->ncols; ++i)
{
/*elog(INFO,"i:%d", i);*/
/*elog(INFO,"var attno i:%d", idxcd->varattno[i]);*/
/*elog(INFO,"cols:%s", cols.data);*/
appendStringInfo( &cols, "%s a.attnum=%d", (i>0 ? " OR" : ""), idxcd->varattno[i]);
/*elog(INFO,"cols:%s", cols.data);*/
/*elog(INFO,"i:%d", i);*/
elog(INFO,"varattno i:%d", idxcd->varattno[i]);
}/* foreach col in varattno*/
/*elog(INFO,"PASA EL FOR");*/
appendStringInfo( &cols, "%s", ")");
/* FIXME: Mention the column names explicitly after the table name. */
appendStringInfo( &query, "%s;", cols.data);
elog(INFO,"QUERY:%s", query.data);
/*elog(INFO,"LONGITUD:%d", query.len);*/
if( query.len > 0 ) /* if we generated any SQL */
{
outerContext = CurrentMemoryContext;
if( SPI_connect() == SPI_OK_CONNECT )
{
/*elog(INFO,"CONECTADO:%d", query.len);*/
ret=SPI_exec(query.data, 0);
proc=SPI_processed;
TupleDesc tupdesc=SPI_tuptable->tupdesc;
SPITupleTable *tuptable=SPI_tuptable;
char buf[8192];
if( ret>0 )
{
/*elog(INFO,"EJECUTA:%d", query.len);*/
if( SPI_tuptable != NULL)
{
//TupleDesc tupdesc;
//SPITupleTable *tuptable = SPI_tuptable;
//tupdesc = tuptable->tupdesc;
elog(INFO,"procantesciclo:%d", proc);
int i,j;
for(j=0;j<proc;j++)
{
HeapTuple tuple;
elog(INFO,"procdespuesciclo:%d", proc);
/*cada fila*/
int cont=0;
tuple=tuptable->vals[j];
if (tuple!=NULL)
{
for (i=1,buf[0]=0;i<=tupdesc->natts;i++)
{
char *data;
/* cada columna de cada fila*/
data=SPI_getvalue(tuple,tupdesc,i);
elog(INFO,"data:%s", data);
idxcd->varattnombres[i]=MemoryContextStrdup(outerContext, data);
elog(INFO,"valorgc:%s", idxcd->varattnombres[i]);
elog(INFO,"indice:%d", cont);
cont++;
snprintf(buf + strlen (buf), sizeof(buf) - strlen(buf), " %s%s", SPI_getvalue(tuple, tupdesc, i),(i == tupdesc->natts) ? " " : " |");
} /* (i=0,buf[0]=0;i<tupdesc->natts;i++)*/
elog (INFO, "EXECQ: %s", buf);
} /* if (tuple!=null)*/
else
elog( WARNING, "IND ADV: tuple is null." );
} /* (j=0;j<proc;j++)*/
} /*if( SPI_tuptable != NULL)*/
else
elog( WARNING, "IND ADV: SPI_tuptable is null." );
}
else
elog( WARNING, "IND ADV: SPI_execute failed while select." );
if( SPI_finish() != SPI_OK_FINISH )
elog( WARNING, "IND ADV: SPI_finish failed while select." );
} /*if( SPI_connect() == SPI_OK_CONNECT )*/
else
elog( WARNING, "IND ADV: SPI_connect failed while select." );
} /*if( query.len > 0 )*/
elog (INFO, "if( query.len > 0");
/*if( query.len > 0 )*/
} /* foreach cell in candidates */
elog (INFO, "/* foreach cell in candidates */");
foreach( cell, candidates ) /* foreach cell in candidates */
{
MemoryContext oldContext = MemoryContextSwitchTo( outerContext );
MemoryContextSwitchTo( oldContext );
/*elog (INFO, "Ingresando a foreach");*/
idxcd = (IndexCandidate*)lfirst( cell );
if (idxcd == NULL) {
elog( INFO, "idxcd IS NULL" );
continue; /* Or is that fatal enough to break instead? */
}
if (!idxcd->idxused)
continue;
int i;
for (i = 0; i < idxcd->ncols; ++i)
{
/*elog(INFO,"cols:%s", cols.data);*/
elog(INFO,"i:%d", i);
elog(INFO,"varattnombres i:%s", idxcd->varattnombres[i]);
elog(INFO,"varattno i:%d", idxcd->varattno[i]);
}/* foreach col in varattno*/
}
/* TODO: Propose to -hackers to introduce API to free a StringInfoData . */
if ( query.len > 0 )
pfree( query.data );
elog( DEBUG3, "IND ADV: select: EXIT" );
elog (INFO, "retornando get_columnnames");
return candidates;
}
[toc] | [next] | [standalone]
| From | Yessica Brinkmann <brinkmann.yessica@gmail.com> |
|---|---|
| Date | 2020-09-15 21:28 -0700 |
| Message-ID | <594a9ad1-f7ef-43f1-aae7-86eb420e8cc9n@googlegroups.com> |
| In reply to | #95 |
El martes, 15 de septiembre de 2020 a las 23:14:22 UTC-4, Yessica Brinkmann escribió:
> Hello.
> I think several of you will already remember me. I'm the one with the IndexAdviser topic. Only that I changed my email address.
> As you may recall, I am doing my thesis on the subject of IndexAdviser modifications.
> I really appreciate the help they have given me in various Postgresql groups.
> Well, I was really nearing the end of the programming part of the thesis, when I had a problem to be able to compile my program in a moment, and by accident some lines of source code were moved.
> And for this reason, I think I have problems again with the context switch issue, since at some point my context switch stopped working for me, I think because of the issue that some lines of source code were moved.
> Well, the fact is that I have a function called get_columnnames, which in the second foreach, is printing the values of idxcd-> varattnnames [i] the null value.
> This second foreach, I only do it to test if the data is really saved well and if I can recover it properly.
> And since the data is not retrieved properly, or is not saved properly, in the following functions of my program, the value of idxcd-> varattnnames [i] continues to appear as null.
> I will appreciate a lot please help, if you can tell me please why the function prints null in the values of idxcd-> varattnnames [i], in the second foreach, if it is due to an error in the context switch, or why it could be .
> Best regards,
> Yessica Brinkmann.
> Below I write my function:
> static List*
> get_columnnames( List* candidates )
> {
> int proc;
> int ret;
> StringInfoData query; /* string for Query */
> StringInfoData cols; /* string for Columns */
> MemoryContext outerContext;
> ListCell *cell;
>
>
>
>
> IndexCandidate* idxcd;
>
>
> elog( DEBUG3, "IND ADV: get_column_names: ENTER" );
>
>
>
>
> initStringInfo( &query );
> initStringInfo( &cols );
>
> foreach( cell, candidates ) /* foreach cell in candidates */
> {
>
> int i;
>
>
>
> /*elog (INFO, "Ingresando a foreach");*/
> idxcd = (IndexCandidate*)lfirst( cell );
>
> if (idxcd == NULL) {
> elog( INFO, "idxcd IS NULL" );
> continue; /* Or is that fatal enough to break instead? */
> }
>
> if (!idxcd->idxused)
> continue;
>
>
>
>
> /* pfree() the memory allocated for the previous candidate. FIXME: Avoid
> * meddling with the internals of a StringInfo, and try to use an API.
> */
> if( cols.len > 0 )
> {
> initStringInfo(&cols);
> } /*IF col.len>0*/
>
> if( query.len > 0 )
> {
> initStringInfo(&query);
> } /*IF col.len>0*/
>
> elog(INFO,"reloid:%d", idxcd->reloid);
> appendStringInfo( &query, "select a.attname from pg_class c,pg_attribute a where c.oid=%d AND a.attrelid = c.oid AND (", idxcd->reloid);
>
> /*elog(INFO,"QUERY:%s", query.data);*/
>
> /*elog(INFO,"ncols:%d", idxcd->ncols);*/
>
> for (i = 0; i < idxcd->ncols; ++i)
> {
> /*elog(INFO,"i:%d", i);*/
> /*elog(INFO,"var attno i:%d", idxcd->varattno[i]);*/
> /*elog(INFO,"cols:%s", cols.data);*/
> appendStringInfo( &cols, "%s a.attnum=%d", (i>0 ? " OR" : ""), idxcd->varattno[i]);
> /*elog(INFO,"cols:%s", cols.data);*/
> /*elog(INFO,"i:%d", i);*/
> elog(INFO,"varattno i:%d", idxcd->varattno[i]);
>
>
> }/* foreach col in varattno*/
>
> /*elog(INFO,"PASA EL FOR");*/
> appendStringInfo( &cols, "%s", ")");
>
> /* FIXME: Mention the column names explicitly after the table name. */
> appendStringInfo( &query, "%s;", cols.data);
>
> elog(INFO,"QUERY:%s", query.data);
> /*elog(INFO,"LONGITUD:%d", query.len);*/
>
> if( query.len > 0 ) /* if we generated any SQL */
> {
>
>
> outerContext = CurrentMemoryContext;
> if( SPI_connect() == SPI_OK_CONNECT )
> {
> /*elog(INFO,"CONECTADO:%d", query.len);*/
>
> ret=SPI_exec(query.data, 0);
> proc=SPI_processed;
> TupleDesc tupdesc=SPI_tuptable->tupdesc;
> SPITupleTable *tuptable=SPI_tuptable;
> char buf[8192];
> if( ret>0 )
> {
> /*elog(INFO,"EJECUTA:%d", query.len);*/
>
>
> if( SPI_tuptable != NULL)
> {
>
> //TupleDesc tupdesc;
>
> //SPITupleTable *tuptable = SPI_tuptable;
>
> //tupdesc = tuptable->tupdesc;
>
>
> elog(INFO,"procantesciclo:%d", proc);
> int i,j;
> for(j=0;j<proc;j++)
> {
> HeapTuple tuple;
> elog(INFO,"procdespuesciclo:%d", proc);
> /*cada fila*/
> int cont=0;
> tuple=tuptable->vals[j];
> if (tuple!=NULL)
> {
>
> for (i=1,buf[0]=0;i<=tupdesc->natts;i++)
> {
> char *data;
>
> /* cada columna de cada fila*/
>
> data=SPI_getvalue(tuple,tupdesc,i);
> elog(INFO,"data:%s", data);
>
>
> idxcd->varattnombres[i]=MemoryContextStrdup(outerContext, data);
>
> elog(INFO,"valorgc:%s", idxcd->varattnombres[i]);
> elog(INFO,"indice:%d", cont);
> cont++;
> snprintf(buf + strlen (buf), sizeof(buf) - strlen(buf), " %s%s", SPI_getvalue(tuple, tupdesc, i),(i == tupdesc->natts) ? " " : " |");
>
> } /* (i=0,buf[0]=0;i<tupdesc->natts;i++)*/
> elog (INFO, "EXECQ: %s", buf);
> } /* if (tuple!=null)*/
> else
> elog( WARNING, "IND ADV: tuple is null." );
> } /* (j=0;j<proc;j++)*/
> } /*if( SPI_tuptable != NULL)*/
> else
> elog( WARNING, "IND ADV: SPI_tuptable is null." );
> }
> else
> elog( WARNING, "IND ADV: SPI_execute failed while select." );
> if( SPI_finish() != SPI_OK_FINISH )
> elog( WARNING, "IND ADV: SPI_finish failed while select." );
>
> } /*if( SPI_connect() == SPI_OK_CONNECT )*/
>
> else
> elog( WARNING, "IND ADV: SPI_connect failed while select." );
>
>
>
> } /*if( query.len > 0 )*/
> elog (INFO, "if( query.len > 0");
>
> /*if( query.len > 0 )*/
>
> } /* foreach cell in candidates */
> elog (INFO, "/* foreach cell in candidates */");
>
> foreach( cell, candidates ) /* foreach cell in candidates */
> {
>
>
> MemoryContext oldContext = MemoryContextSwitchTo( outerContext );
> MemoryContextSwitchTo( oldContext );
>
>
> /*elog (INFO, "Ingresando a foreach");*/
> idxcd = (IndexCandidate*)lfirst( cell );
>
> if (idxcd == NULL) {
> elog( INFO, "idxcd IS NULL" );
> continue; /* Or is that fatal enough to break instead? */
> }
>
> if (!idxcd->idxused)
> continue;
>
>
> int i;
> for (i = 0; i < idxcd->ncols; ++i)
> {
>
> /*elog(INFO,"cols:%s", cols.data);*/
> elog(INFO,"i:%d", i);
> elog(INFO,"varattnombres i:%s", idxcd->varattnombres[i]);
> elog(INFO,"varattno i:%d", idxcd->varattno[i]);
>
>
> }/* foreach col in varattno*/
>
> }
>
>
> /* TODO: Propose to -hackers to introduce API to free a StringInfoData . */
> if ( query.len > 0 )
> pfree( query.data );
>
>
> elog( DEBUG3, "IND ADV: select: EXIT" );
> elog (INFO, "retornando get_columnnames");
> return candidates;
> }
I wanted to send my function as a separate source code file, but I am not allowed to send emails from the mail, I get a warning that messages can only be sent from Google Groups, and it does not allow sending messages with attachments.
[toc] | [prev] | [standalone]
Back to top | Article view | pgsql.general
csiph-web