Hi,

I'm trying to develop a contrib module in order to parse sqlf queries, I'm
using lemon as a LALR parser generator (because I think it's easier than
bison) and re2c (because I think it's easier than flex) but when I try to
split the string into words postgres add some weird characters (this works
in pure gcc), I write something like "CREATE FUZZY PREDICATE joven ON 0..120
AS (0,0,35,120);", but postgresql adds a character like  at the end of
"joven" and the others words.

The code I use to split the string is:

void parse_query(char *str,const char **sqlf){

    parse_words(str);
    *sqlf=fuzzy_query;
}
void parse_words(char *str){
    char *word;
    int token;
    const char semicolon =';';
    const char dot='.';
    const char comma=',';
    const char open_bracket='(';
    const char close_bracket=')';
    struct Token sToken;

    int i = 0;

    void* pParser = ParseAlloc (malloc);

    while(str[i] !='\0'){
        int c=0;

        word=(char *)malloc(sizeof(char));

        if(isspace(str[i]) || str[i]==semicolon){
            i++;
            continue;
        }

        if (str[i]==open_bracket || str[i]==close_bracket ||
            str[i]==dot || str[i]==comma){
                word[c] = str[i];
                i++;
                token=scan(word, strlen(word));
                Parse(pParser, token, sToken);
                continue;
        }else{
            while(!isspace(str[i]) && str[i]!=semicolon && str[i]!='\0' &&
                    str[i]!=open_bracket && str[i]!=close_bracket &&
                    str[i]!=dot && str[i]!=comma){
                        word[c++] = str[i++];
            }
        }

        token=scan(word, strlen(word));

        if (token==PARAMETRO){
            //TODO: I don't know why it needs the malloc function again, all
I know is it's working
            const char *param=word;
            word= (char *)malloc(sizeof(char));
            sToken.z=param;
        }

        Parse(pParser, token, sToken);
        free(word);
    }
  Parse(pParser, 0, sToken);
  ParseFree(pParser, free );

}

Header:

#ifndef SQLF_H_
#define SQLF_H_

typedef struct Token {
  const char *z;
  int value;
  unsigned n;
} Token;
void parse_query(char *str,const char **sqlf);
void parse_words(char *str);
int scan(char *s, int l);

#endif /* SQLF_H_ */


Screen:

postgres=# select * from fuzzy.sqlf('CREATE FUZZY PREDICATE joven ON 0..120
AS (0,0,35,120);'::text);
ERROR:  syntax error at or near ""
LINE 1: INSERT INTO fuzzydb.pg_fuzzypredicate VALUES(joven,0�
                                                               �,120
                                                                     ...
                                                          ^
QUERY:  INSERT INTO fuzzydb.pg_fuzzypredicate VALUES(joven,0�
                                                               �,120
                                                                     �,0�

�,0�

�,35

�,120

�);

Thanks for any help

Reply via email to