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

Responder a