problem with splitting a string - Mailing list pgsql-hackers
| From | Werner Echezuria |
|---|---|
| Subject | problem with splitting a string |
| Date | |
| Msg-id | 2485a25e0908050654s7012ea27sf2106d5de29b1297@mail.gmail.com Whole thread Raw |
| Responses |
Re: problem with splitting a string
|
| List | pgsql-hackers |
Hi,<br /><br />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
splitthe string into words postgres add some weird characters (this works in pure gcc), I write something like "CREATE
FUZZYPREDICATE joven ON 0..120 AS (0,0,35,120);", but postgresql adds a character like at the end of "joven" and the
otherswords.<br /><br />The code I use to split the string is:<br /><br />void parse_query(char *str,const char
**sqlf){<br/><br /> parse_words(str);<br /> *sqlf=fuzzy_query;<br />}<br />void parse_words(char *str){<br />
char*word;<br /> int token;<br /> const char semicolon =';';<br /> const char dot='.';<br /> const char
comma=',';<br/> const char open_bracket='(';<br /> const char close_bracket=')';<br /> struct Token sToken;<br
/><br/> int i = 0;<br /><br /> void* pParser = ParseAlloc (malloc);<br /><br /> while(str[i] !='\0'){<br />
int c=0;<br /><br /> word=(char *)malloc(sizeof(char));<br /><br /> if(isspace(str[i]) ||
str[i]==semicolon){<br/> i++;<br /> continue;<br /> }<br /><br /> if
(str[i]==open_bracket|| str[i]==close_bracket ||<br /> str[i]==dot || str[i]==comma){<br />
word[c]= str[i];<br /> i++;<br /> token=scan(word, strlen(word));<br />
Parse(pParser,token, sToken);<br /> continue;<br /> }else{<br />
while(!isspace(str[i])&& str[i]!=semicolon && str[i]!='\0' &&<br />
str[i]!=open_bracket&& str[i]!=close_bracket &&<br /> str[i]!=dot &&
str[i]!=comma){<br/> word[c++] = str[i++];<br /> }<br /> }<br /><br />
token=scan(word,strlen(word));<br /><br /> if (token==PARAMETRO){<br /> //TODO: I don't know why it
needsthe malloc function again, all I know is it's working<br /> const char *param=word;<br />
word=(char *)malloc(sizeof(char));<br /> sToken.z=param;<br /> }<br /><br /> Parse(pParser,
token,sToken);<br /> free(word);<br /> }<br /> Parse(pParser, 0, sToken);<br /> ParseFree(pParser, free
);<br/><br />}<br /><br />Header:<br /><br />#ifndef SQLF_H_<br />#define SQLF_H_<br /><br />typedef struct Token {<br
/> const char *z;<br /> int value;<br /> unsigned n;<br />} Token;<br />void parse_query(char *str,const char
**sqlf);<br/>void parse_words(char *str);<br /> int scan(char *s, int l);<br /><br />#endif /* SQLF_H_ */<br /><br
/><br/>Screen:<br /><br />postgres=# select * from fuzzy.sqlf('CREATE FUZZY PREDICATE joven ON 0..120 AS
(0,0,35,120);'::text);<br/>ERROR: syntax error at or near ""<br /> LINE 1: INSERT INTO fuzzydb.pg_fuzzypredicate
VALUES(joven,0�<br/> �,120<br
/> ...<br
/> ^<br /> QUERY: INSERT INTO fuzzydb.pg_fuzzypredicate
VALUES(joven,0�<br/> �,120<br
/> �,0�<br
/> �,0�<br />
�,35<br
/> �,120<br
/> �);<br /><br />Thanks
forany help<br />
pgsql-hackers by date: