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
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 |