Index: include/mdbsql.h
===================================================================
RCS file: /cvsroot/mdbtools/mdbtools/include/mdbsql.h,v
retrieving revision 1.9
diff -u -r1.9 mdbsql.h
--- include/mdbsql.h	10 Jan 2004 01:52:56 -0000	1.9
+++ include/mdbsql.h	19 Jan 2004 07:50:51 -0000
@@ -14,6 +14,7 @@
 	int num_tables;
 	GPtrArray *tables;
 	int num_sargs;
+	int max_rows;
 	GPtrArray *sargs;
 	MdbTableDef *cur_table;
 	MdbSargNode *sarg_tree;
@@ -42,7 +43,7 @@
 	MdbSarg *sarg;
 } MdbSQLSarg;
 
-char *g_input_ptr;
+extern char *g_input_ptr;
 
 #undef YY_INPUT
 #define YY_INPUT(b, r, ms) (r = mdb_sql_yyinput(b, ms));
@@ -70,5 +71,6 @@
 extern void mdb_sql_listtables(MdbSQL *sql);
 extern void mdb_sql_add_not(MdbSQL *sql);
 extern void mdb_sql_describe_table(MdbSQL *sql);
-
+int mdbsql_run_query(MdbSQL *sql, char *mybuf);
+void mdb_sql_set_maxrow(MdbSQL *sql,int aMaxrow);
 #endif
Index: include/mdbtools.h
===================================================================
RCS file: /cvsroot/mdbtools/mdbtools/include/mdbtools.h,v
retrieving revision 1.27
diff -u -r1.27 mdbtools.h
--- include/mdbtools.h	10 Jan 2004 01:52:56 -0000	1.27
+++ include/mdbtools.h	19 Jan 2004 07:50:52 -0000
@@ -132,7 +132,7 @@
 #define IS_JET3(mdb) (mdb->f->jet_version==MDB_VER_JET3)
 
 /* hash to store registered backends */
-GHashTable	*mdb_backends;
+extern GHashTable	*mdb_backends;
 
 /* forward declarations */
 typedef struct mdbindex MdbIndex;
Index: src/libmdb/backend.c
===================================================================
RCS file: /cvsroot/mdbtools/mdbtools/src/libmdb/backend.c,v
retrieving revision 1.11
diff -u -r1.11 backend.c
--- src/libmdb/backend.c	10 Jan 2004 01:52:57 -0000	1.11
+++ src/libmdb/backend.c	19 Jan 2004 07:50:52 -0000
@@ -27,6 +27,7 @@
 #include "dmalloc.h"
 #endif
 
+GHashTable       *mdb_backends;
    /*    Access data types */
 MdbBackendType mdb_access_types[] = {
  */
 
Index: src/sql/lexer.l
===================================================================
RCS file: /cvsroot/mdbtools/mdbtools/src/sql/lexer.l,v
retrieving revision 1.6
diff -u -r1.6 lexer.l
--- src/sql/lexer.l	20 Jan 2003 16:04:31 -0000	1.6
+++ src/sql/lexer.l	19 Jan 2004 07:50:59 -0000
@@ -40,13 +40,16 @@
 (<=)		{ return LTEQ; }
 (>=)		{ return GTEQ; }
 like		{ return LIKE; }
+1[ ]=[ ]0   { return MAX0ROW; }
+0[ ]=[ ]1   { return MAX0ROW; }
+
 [ \t\r]	;
-\"[A-z][A-z0-9 _]*\"   {
+\"[a-zA-Z_][a-zA-Z0-9_ #@i ]*\"   {
 				yylval.name = strdup(&yytext[1]);
 				yylval.name[strlen(yylval.name)-1]='\0';
 				return IDENT;
 			}
-[A-z][A-z0-9_]*		{ yylval.name = strdup(yytext); return NAME; }
+[a-zA-Z_][a-zA-Z0-9_#@]*		{ yylval.name = strdup(yytext); return NAME; }
 
 '.*'			{ yylval.name = strdup(yytext); return STRING; }
 ([0-9]+|([0-9]*\.[0-9+)([eE][-+]?[0-9]+)?) { 
Index: src/sql/mdbsql.c
===================================================================
RCS file: /cvsroot/mdbtools/mdbtools/src/sql/mdbsql.c,v
retrieving revision 1.14
diff -u -r1.14 mdbsql.c
--- src/sql/mdbsql.c	10 Jan 2004 01:52:57 -0000	1.14
+++ src/sql/mdbsql.c	19 Jan 2004 07:51:00 -0000
@@ -31,6 +31,8 @@
 #include <wordexp.h>
 #endif
 
+char *g_input_ptr;
+
 void
 mdb_sql_error(char *fmt, ...)
 {
@@ -65,8 +67,38 @@
 	sql->sargs = g_ptr_array_new();
 	sql->sarg_tree = NULL;
 	sql->sarg_stack = NULL;
+ 	sql->max_rows = -1;
 
 	return sql;
+}
+
+ int _parse(MdbSQL *sql, char *buf)
+ {
+ 	g_input_ptr = buf;
+ 	/* begin unsafe */
+ 	_mdb_sql(sql);
+ 	if (yyparse()) {
+ 		/* end unsafe */
+ 		fprintf(stderr, "Couldn't parse SQL\n");
+ 		mdb_sql_reset(sql);
+ 		return 0;
+ 	} else {
+ 		return 1;
+ 	}
+ }
+int mdbsql_run_query(MdbSQL *sql, char *mybuf)
+{
+	if (_parse(sql, mybuf) && sql->cur_table) {
+		mdbsql_bind_all(sql);
+		return 1;
+	}
+	else
+		return 0;
+}
+ 
+void mdb_sql_set_maxrow(MdbSQL *sql,int aMaxrow)
+{
+	sql->max_rows = aMaxrow;
 }
 
 MdbSQLSarg *mdb_sql_alloc_sarg()
Index: src/sql/parser.y
===================================================================
RCS file: /cvsroot/mdbtools/mdbtools/src/sql/parser.y,v
retrieving revision 1.7
diff -u -r1.7 parser.y
--- src/sql/parser.y	20 Jan 2003 16:04:31 -0000	1.7
+++ src/sql/parser.y	19 Jan 2004 07:51:01 -0000
@@ -40,7 +40,7 @@
 
 
 
-%token <name> IDENT NAME PATH STRING NUMBER 
+%token <name> IDENT NAME PATH STRING NUMBER  MAX0ROW
 %token SELECT FROM WHERE CONNECT DISCONNECT TO LIST TABLES WHERE AND OR NOT
 %token DESCRIBE TABLE
 %token LTEQ GTEQ LIKE
@@ -48,6 +48,7 @@
 %type <name> database
 %type <name> constant
 %type <ival> operator
+%type <name> identify
 
 %%
 
@@ -80,7 +81,11 @@
 	;
 
 sarg_list:
-	sarg 
+ 	MAX0ROW { 
+ 				mdb_sql_set_maxrow(_mdb_sql(NULL), 0);
+ 				}
+	| sarg 
+ 	| '('  sarg AND sarg_list  ')'
 	| '(' sarg_list ')'
 	| NOT sarg_list { mdb_sql_add_not(_mdb_sql(NULL)); }
 	| sarg_list OR sarg_list { mdb_sql_add_or(_mdb_sql(NULL)); }
@@ -88,18 +93,33 @@
 	;
 
 sarg:
-	NAME operator constant	{ 
+ 	'(' sarg ')'
+ 	| identify operator constant	{ 
 				mdb_sql_add_sarg(_mdb_sql(NULL), $1, $2, $3);
 				free($1);
 				free($3);
 				}
-	| constant operator NAME {
+ 	| constant operator identify {
+ 				mdb_sql_add_sarg(_mdb_sql(NULL), $3, $2, $1);
+ 				free($1);
+ 				free($3);
+ 				}
+ 	| identify operator identify {
+ 				mdb_sql_add_sarg(_mdb_sql(NULL), $3, $2, $1);
+ 				free($1);
+ 				free($3);
+ 				}
+ 	| constant operator constant {
 				mdb_sql_add_sarg(_mdb_sql(NULL), $3, $2, $1);
 				free($1);
 				free($3);
 				}
 	;
 
+identify:
+	IDENT
+ 	|	NAME 
+
 operator:
 	'='	{ $$ = MDB_EQUAL; }
 	| '>'	{ $$ = MDB_GT; }
@@ -115,12 +135,12 @@
 
 database:
 	PATH
-	|	NAME 
+ 	|	identify
 	;
 
 table:
-	NAME { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); }
-	| IDENT { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); }
+ 	identify { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); }
+ 	| identify identify { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); }
 	;
 
 column_list:
@@ -130,8 +150,7 @@
 	;
 	 
 column:
-	NAME { mdb_sql_add_column(_mdb_sql(NULL), $1); free($1); }
-	| IDENT { mdb_sql_add_column(_mdb_sql(NULL), $1); free($1); }
+ 	identify { mdb_sql_add_column(_mdb_sql(NULL), $1); free($1); }
 	;
 
 %%
