Insertar un arreglo en el catalogo

From: "Arturo Rossodivita" <arossodivita(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Insertar un arreglo en el catalogo
Date: 2008-07-09 16:35:19
Message-ID: 36fdef070807090935x1733de06k8f70d2dc8f99d3e1@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola, les escribo porque me encuentro en estos momentos extendiendo un
trabajo realizado sobre PostgreSQL para el uso de conguntos difusos y me he
encontrado con un problema.*
*
lo primero que estoy extendiendo es el CreateFuzzyPredStmt, ahora los
parametros pedidos son dinamicos, es decir, no hay una cantidad predefinida
de parametros sino de 1 a N.

la sintaxis queda de la siguiente manera:

CREATE FUZZY PREDICATE <nombre> ON <Dominio> AS (<pred1 / grado1>, <pred2 /
grado2>, ... , <predN / gradoN>);

*la tabla del catalogo pg_fuzzypred la extendi colocando la variable

*NameData preddisd*;

para almacenar los dominios discretos y un arreglo
*
anyarray predcompfplist*;

para almacenar los parametros del CREATE FUZZY PREDICATE
*
*luego en el gram.y extendi el CreateFuzzyPredStmt colocando lo siguiente:*

|
CREATE FUZZY PREDICATE ColId ON ColId AS '('CompFpList')'
{
CreateFuzzyPredStmt *n = makeNode(CreateFuzzyPredStmt);
n->pred=$4;
n->disd=$6;
n->compfplist=$9;
n->typefp=4;
$$ = (Node *)n;
}
;

CompFpList: CompFp { $$ =
list_make1($1);}
| CompFpList ',' CompFp { $$ = lappend($1,
$3);}
;

CompFp: CompFpName { $$ =
makeStringConst($1, NULL);}
;

CompFpName: SCONST { $$ = $1; }
;

*donde CompFpList es una lista, CompFP son nodos y CompFPName constantes
string.
*
*en el parsenodes.h en las estructuras A_FuzzyPred y CreateFuzzyPredStmt
agregue las variables :*

List *compfplist;
char *disd;

*en src/backend/commands/fuzzypred.c*

*agregue las variables:*

List *compfplist;
char *disd;

*el case :*

case EXTENSION:
typefp=EXTENSION;
disd=stmt->disd;
compfplist=stmt->compfplist;
break;

*y guardo los nuevos datos:*

new_record[Anum_pg_fuzzypred_preddisd - 1] =
DirectFunctionCall1(namein, CStringGetDatum(stmt->disd));
new_record[Anum_pg_fuzzypred_predcompfplist -1] =
DirectFunctionCall1(namein, CStringGetDatum(stmt->compfplist));

*Luego en el pg_attribute:*

*inserto los datos:*

DATA(insert ( 2859 preddisd 19 -1 NAMEDATALEN 9 0 -1 -1 f p i t f
f t 0));
DATA(insert ( 2859 predcompfplist 2277 -1 -1 10 1 -1 -1 f p x t f f t
0));

*Hasta este punto "esta todo bien" compila bien el postgreSQL arranca y creo
el predicado difuso*

CREATE FUZZY PREDICATE gordo ON contextura AS ('obeso / 1','normal / 0.4');

*y en el catalogo almacena por lo momentos el nombre gordo y el tipo 4. El
problema viene cuando en el pg_class
al insertar los datos pasandole la nueva cantidad de argumentos,
anteriormente 8 ahora 10 de la siguiente manera:*

DATA(insert OID = 2859 ( pg_fuzzypred PGNSP 87 PGUID 0 2859 0 0 0 0
0 f f r 10 0 0 0 0 0 f f f f 3 _null_ _null_ ));
DESCR("");

tambien compila y arranca pero al crear el predicado difuso el servidor se
cae mandandome un mensaje que hay un problema antes o despues de realizar la
operacion. Cuando en el pg_class le digo que me inserte nada mas 9
atributos, es decir, obviando los parametros y solo insertando el dominio
discreto lo realiza perfecto y almacena el dominio, para el ejemplo anterior
contextura.

De verdad no logro como hacer para insertar el arreglo, no se si los
parametros que paso en el pg_attribute estan malos y por ahi viene el
problema o que, si alguien puede ayudarme se lo agradeceria muchisimo pues
llevo ya tiempo estancado con esto. Gracias

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Juan Mora Mora 2008-07-09 16:36:53 Consulta cruzada
Previous Message marcelo Cortez 2008-07-09 16:27:31 Re: Postgres desde Clipper