From cc0088db0de2ffc5440d8706c3e3e21b08894ffe Mon Sep 17 00:00:00 2001 From: genoa Date: Mon, 7 Dec 1992 09:47:45 +0000 Subject: [PATCH] Sped up some query-table queries by adding optimize_sql_stmt() call to build_sql_stmt(). --- server/qrtn.dc | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/server/qrtn.dc b/server/qrtn.dc index 4944c856..9234e76b 100644 --- a/server/qrtn.dc +++ b/server/qrtn.dc @@ -14,6 +14,7 @@ static char *rcsid_qrtn_dc = "$Header$"; #endif lint #include +#include #include "query.h" #include "mr_server.h" EXEC SQL INCLUDE sqlca; /* SQL Communications Area */ @@ -717,6 +718,91 @@ EXEC SQL END DECLARE SECTION; return ((rowcount == 0) ? MR_NO_MATCH : MR_SUCCESS); } +char *sqlstrstr(str,pat) + char *str; + char *pat; +{ + register char *p=pat; + + do { + if(*str=='\'') { /* Skip over single-quote delimited substrings */ + while(*++str && (*str!='\'')) + ; + continue; + } + if(*str==*p) { + register char *s; + s=str; + while(*++p && (*++s==*p)) + ; + if(*p) p=pat; /* failed */ + } + } while(*p && *++str); + + if(!*str) str=NULL; + return(str); +} + +void optimize_sql_stmt(buf) +char *buf; +{ + char *point=buf, *pat, *eopat, *esc1, *esc2, *csr; + + for(point=buf; point=sqlstrstr(point,"LIKE"); point++) { + /* Now pointing to string "LIKE" */ + + /* Look at next word */ + for(pat=point+4; *pat==' '; pat++) ; + + /* Is it a single-quote delimited string? */ + if(*pat!='\'') continue; + + /* look for "escape" clause - save escape character */ + /* 1. Find end of pattern */ + for(eopat=pat+1; 1; eopat++) { + if(*eopat=='\'') { + if(eopat[1]=='\'') /* single-quote is self-escaping */ + eopat++; + else + break; + } + } + + /* 2. Look at next word */ + for(esc1=eopat; *++esc1==' ';) ; + + /* 3. esc1=0 if not "ESCAPE '?'", where the ? may be any character. */ + if(strncmp(esc1,"ESCAPE",6)) esc1=NULL; + + if(esc1) { + for(esc2=esc1+6; *esc2==' '; esc2++) ; + + if(*esc2++!='\'') continue; /* Bad SQL syntax. Skip. */ + /* esc2 now points at the escape character itself */ + if(esc2[1]!='\'') continue; /* Weird escape string. Skip. */ + } else { + esc2="\\"; + } + + /* Is pattern free from special characters? */ + for(csr=pat; csr result buffer */ } *res='\0'; + + optimize_sql_stmt(result_buf); } do_update(q, argv, qual, action, actarg) -- 2.45.2