From b0942cbf7d037bcb6be128d58e617e7f891ec773 Mon Sep 17 00:00:00 2001 From: brianb Date: Tue, 21 Jan 2003 23:43:31 +0000 Subject: [PATCH] fix for like clause in jet4 --- include/mdbtools.h | 3 ++- src/libmdb/data.c | 21 ++++++++++++++++++++- src/libmdb/index.c | 4 ++-- src/libmdb/like.c | 11 +++++++++++ src/libmdb/sargs.c | 31 +++++++++++++++++++------------ 5 files changed, 54 insertions(+), 16 deletions(-) diff --git a/include/mdbtools.h b/include/mdbtools.h index e440d3b..439e755 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -377,6 +377,7 @@ extern int mdb_find_end_of_row(MdbHandle *mdb, int row); extern int mdb_col_fixed_size(MdbColumn *col); extern int mdb_col_disp_size(MdbColumn *col); extern void mdb_bind_len(MdbTableDef *table, int col_num, int *len_ptr); +extern int mdb_unicode2ascii(MdbHandle *mdb, unsigned char *buf, int offset, int len, char *dest); /* dump.c */ extern void buffer_dump(const unsigned char* buf, int start, int end); @@ -390,7 +391,7 @@ extern char *mdb_get_relationships(MdbHandle *mdb); /* sargs.c */ extern int mdb_test_sargs(MdbTableDef *table, MdbField *fields, int num_fields); -extern int mdb_test_sarg(MdbColumn *col, MdbSargNode *node, void *buf, int len); +extern int mdb_test_sarg(MdbHandle *mdb, MdbColumn *col, MdbSargNode *node, void *buf, int len); extern void mdb_sql_walk_tree(MdbSargNode *node, MdbSargTreeFunc func, gpointer data); extern int mdb_find_indexable_sargs(MdbSargNode *node, gpointer data); diff --git a/src/libmdb/data.c b/src/libmdb/data.c index c90c138..77dba85 100644 --- a/src/libmdb/data.c +++ b/src/libmdb/data.c @@ -658,7 +658,6 @@ guint16 row_start, row_stop; guint8 memo_row; guint32 lval_pg; guint16 len; -int i; if (sizepg_buf[row_start], len); text[len]='\0'; } else { + mdb_unicode2ascii(mdb, mdb->pg_buf, row_start, len, text); +#if 0 if (mdb->pg_buf[row_start]==0xff && mdb->pg_buf[row_start+1]==0xfe) { strncpy(text, &mdb->pg_buf[row_start+2], len-2); @@ -718,6 +719,7 @@ int i; text[i/2] = mdb->pg_buf[row_start + i]; text[len/2]='\0'; } +#endif } /* make sure to swap page back */ mdb_swap_pgbuf(mdb); @@ -951,3 +953,20 @@ int mdb_col_fixed_size(MdbColumn *col) } return 0; } +int +mdb_unicode2ascii(MdbHandle *mdb, unsigned char *buf, int offset, int len, char *dest) +{ + int i; + + if (buf[offset]==0xff && + buf[offset+1]==0xfe) { + strncpy(dest, &buf[offset+2], len-2); + dest[len-2]='\0'; + } else { + /* convert unicode to ascii, rather sloppily */ + for (i=0;iop; node.value = sarg->value; - if (!mdb_test_sarg(col, &node, &mdb->pg_buf[offset + c_offset], c_len)) { + if (!mdb_test_sarg(mdb, col, &node, &mdb->pg_buf[offset + c_offset], c_len)) { /* sarg didn't match, no sense going on */ return 0; } @@ -579,7 +579,7 @@ mdb_index_scan_init(MdbHandle *mdb, MdbTableDef *table) int use_index=0; char *s; - if (s=getenv("MDBOPTS")) { + if ((s=getenv("MDBOPTS"))) { if (!strcmp(s, "use_index")) use_index++; } if (use_index && mdb_choose_index(table, &i) == MDB_INDEX_SCAN) { diff --git a/src/libmdb/like.c b/src/libmdb/like.c index 51f4792..1bc9d57 100644 --- a/src/libmdb/like.c +++ b/src/libmdb/like.c @@ -20,10 +20,15 @@ #include #include +//#define MDB_DEBUG_LIKE 1 + int mdb_like_cmp(char *s, char *r) { int i, ret; +#if MDB_DEBUG_LIKE + printf("comparing %s and %s\n", s, r); +#endif switch (r[0]) { case '\0': if (s[0]=='\0') { @@ -51,7 +56,13 @@ int i, ret; if (strncmp(s,r,i)) { return 0; } else { +#if MDB_DEBUG_LIKE + printf("at pos %d comparing %s and %s\n", i, &s[i], &r[i]); +#endif ret = mdb_like_cmp(&s[i],&r[i]); +#if MDB_DEBUG_LIKE + printf("returning %d (%s and %s)\n", ret, &s[i], &r[i]); +#endif return ret; } } diff --git a/src/libmdb/sargs.c b/src/libmdb/sargs.c index 1f6aff1..9e3af33 100644 --- a/src/libmdb/sargs.c +++ b/src/libmdb/sargs.c @@ -113,7 +113,7 @@ mdb_find_indexable_sargs(MdbSargNode *node, gpointer data) return 0; } int -mdb_test_sarg(MdbColumn *col, MdbSargNode *node, void *buf, int len) +mdb_test_sarg(MdbHandle *mdb, MdbColumn *col, MdbSargNode *node, void *buf, int len) { char tmpbuf[256]; int lastchar; @@ -129,9 +129,13 @@ int lastchar; return mdb_test_int(node, _mdb_get_int32(buf, 0)); break; case MDB_TEXT: - strncpy(tmpbuf, buf,255); - lastchar = len > 255 ? 255 : len; - tmpbuf[lastchar]='\0'; + if (IS_JET4(mdb)) { + mdb_unicode2ascii(mdb, buf, 0, len, tmpbuf); + } else { + strncpy(tmpbuf, buf,255); + lastchar = len > 255 ? 255 : len; + tmpbuf[lastchar]='\0'; + } return mdb_test_string(node, tmpbuf); default: fprintf(stderr, "Calling mdb_test_sarg on unknown type. Add code to mdb_test_sarg() for type %d\n",col->col_type); @@ -149,7 +153,8 @@ mdb_find_field(int col_num, MdbField *fields, int num_fields) } return -1; } -mdb_test_sarg_node(MdbSargNode *node, MdbField *fields, int num_fields) +int +mdb_test_sarg_node(MdbHandle *mdb, MdbSargNode *node, MdbField *fields, int num_fields) { int elem; MdbColumn *col; @@ -158,7 +163,7 @@ mdb_test_sarg_node(MdbSargNode *node, MdbField *fields, int num_fields) if (mdb_is_relational_op(node->op)) { col = node->col; elem = mdb_find_field(col->col_num, fields, num_fields); - if (!mdb_test_sarg(col, + if (!mdb_test_sarg(mdb, col, node, fields[elem].value, fields[elem].siz)) @@ -166,18 +171,18 @@ mdb_test_sarg_node(MdbSargNode *node, MdbField *fields, int num_fields) } else { /* logical op */ switch (node->op) { case MDB_NOT: - rc = mdb_test_sarg_node(node->left, fields, num_fields); + rc = mdb_test_sarg_node(mdb, node->left, fields, num_fields); return !rc; break; case MDB_AND: - if (!mdb_test_sarg_node(node->left, fields, num_fields)) + if (!mdb_test_sarg_node(mdb, node->left, fields, num_fields)) return 0; - return mdb_test_sarg_node(node->right, fields, num_fields); + return mdb_test_sarg_node(mdb, node->right, fields, num_fields); break; case MDB_OR: - if (mdb_test_sarg_node(node->left, fields, num_fields)) + if (mdb_test_sarg_node(mdb, node->left, fields, num_fields)) return 1; - return mdb_test_sarg_node(node->right, fields, num_fields); + return mdb_test_sarg_node(mdb, node->right, fields, num_fields); break; } } @@ -187,13 +192,15 @@ int mdb_test_sargs(MdbTableDef *table, MdbField *fields, int num_fields) { MdbSargNode *node; + MdbCatalogEntry *entry = table->entry; + MdbHandle *mdb = entry->mdb; node = table->sarg_tree; /* there may not be a sarg tree */ if (!node) return 1; - return mdb_test_sarg_node(node, fields, num_fields); + return mdb_test_sarg_node(mdb, node, fields, num_fields); } #if 0 int mdb_test_sargs(MdbHandle *mdb, MdbColumn *col, int offset, int len)