From 74805d78e64e94e3b5e876c1fd2c34c294f43e28 Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Thu, 29 Mar 2007 11:14:11 +0000 Subject: [PATCH] Change to emit_term(): when a term has the /regexp relation modifier, do not process it for leading and trailing "^" and "*", which have quite different meanings in regular expressions. --- src/cqltransform.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/cqltransform.c b/src/cqltransform.c index 5cb26cb..2f2f353 100644 --- a/src/cqltransform.c +++ b/src/cqltransform.c @@ -1,4 +1,4 @@ -/* $Id: cqltransform.c,v 1.27 2007-02-07 13:36:58 adam Exp $ +/* $Id: cqltransform.c,v 1.28 2007-03-29 11:14:11 mike Exp $ Copyright (C) 1995-2007, Index Data ApS Index Data Aps @@ -353,6 +353,18 @@ static const char *wcchar(const char *term, int length) } +/* ### checks for CQL relation-name rather than Type-1 attribute */ +static int has_modifier(struct cql_node *cn, const char *name) { + struct cql_node *mod; + for (mod = cn->u.st.modifiers; mod != 0; mod = mod->u.st.modifiers) { + if (!strcmp(mod->u.st.index, name)) + return 1; + } + + return 0; +} + + void emit_term(cql_transform_t ct, struct cql_node *cn, const char *term, int length, @@ -361,10 +373,11 @@ void emit_term(cql_transform_t ct, { int i; const char *ns = cn->u.st.index_uri; + int process_term = !has_modifier(cn, "regexp"); assert(cn->which == CQL_NODE_ST); - if (length > 0) + if (process_term && length > 0) { if (length > 1 && term[0] == '^' && term[length-1] == '^') { @@ -393,7 +406,7 @@ void emit_term(cql_transform_t ct, } } - if (length > 0) + if (process_term && length > 0) { /* Check for well-known globbing patterns that represent * simple truncation attributes as expected by, for example, -- 1.7.10.4