ING_DB
This commit is contained in:
parent
48a90f1501
commit
ab5f16e2a3
|
|
@ -0,0 +1,336 @@
|
||||||
|
# include <stdio.h>
|
||||||
|
# include "gen.h"
|
||||||
|
# include "../h/dbs.h"
|
||||||
|
# include "../h/aux.h"
|
||||||
|
# include "monitor.h"
|
||||||
|
|
||||||
|
int Autoclear; /* clear query buffer automatically if set */
|
||||||
|
int Notnull; /* set if the query is not null */
|
||||||
|
int Peekch; /* lookahead character for getch */
|
||||||
|
int Escape = ESCAPE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** COMMAND TABLE
|
||||||
|
** To add synonyms for commands, add entries to this table
|
||||||
|
*/
|
||||||
|
struct cntrlwd
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
int code;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct cntrlwd Controlwords[] =
|
||||||
|
{
|
||||||
|
# ifdef ESER
|
||||||
|
"A", C_APPEND,
|
||||||
|
"B", C_BRANCH,
|
||||||
|
"D", C_TIME,
|
||||||
|
"E", C_EDIT,
|
||||||
|
"G", C_GO,
|
||||||
|
"H", C_S_HELP,
|
||||||
|
"H", C_L_HELP,
|
||||||
|
"I", C_INCLUDE,
|
||||||
|
"K", C_MARK,
|
||||||
|
"L", C_LIST,
|
||||||
|
"M", C_MONITOR,
|
||||||
|
"P", C_PRINT,
|
||||||
|
"Q", C_QUIT,
|
||||||
|
"R", C_RESET,
|
||||||
|
"S", C_SHELL,
|
||||||
|
"V", C_EVAL,
|
||||||
|
"W", C_WRITE,
|
||||||
|
# endif
|
||||||
|
"a", C_APPEND,
|
||||||
|
"b", C_BRANCH,
|
||||||
|
"d", C_TIME,
|
||||||
|
"e", C_EDIT,
|
||||||
|
"g", C_GO,
|
||||||
|
"h", C_S_HELP,
|
||||||
|
"H", C_L_HELP,
|
||||||
|
"i", C_INCLUDE,
|
||||||
|
"k", C_MARK,
|
||||||
|
"l", C_LIST,
|
||||||
|
"m", C_MONITOR,
|
||||||
|
"p", C_PRINT,
|
||||||
|
"q", C_QUIT,
|
||||||
|
"r", C_RESET,
|
||||||
|
"s", C_SHELL,
|
||||||
|
"v", C_EVAL,
|
||||||
|
"w", C_WRITE,
|
||||||
|
# ifdef ESER
|
||||||
|
"APPEND", C_APPEND,
|
||||||
|
"BRANCH", C_BRANCH,
|
||||||
|
"CD", C_CHDIR,
|
||||||
|
"CHDIR", C_CHDIR,
|
||||||
|
"DATE", C_TIME,
|
||||||
|
"ED", C_EDIT,
|
||||||
|
"EDIT", C_EDIT,
|
||||||
|
"EDITOR", C_EDIT,
|
||||||
|
"EVAL", C_EVAL,
|
||||||
|
"GO", C_GO,
|
||||||
|
"HELP", C_S_HELP,
|
||||||
|
"HELP", C_L_HELP,
|
||||||
|
"INCLUDE", C_INCLUDE,
|
||||||
|
"LIST", C_LIST,
|
||||||
|
"MARK", C_MARK,
|
||||||
|
"MONITOR", C_MONITOR,
|
||||||
|
"PRINT", C_PRINT,
|
||||||
|
"QUIT", C_QUIT,
|
||||||
|
"READ", C_INCLUDE,
|
||||||
|
"RESET", C_RESET,
|
||||||
|
"SH", C_SHELL,
|
||||||
|
"SHELL", C_SHELL,
|
||||||
|
"TIME", C_TIME,
|
||||||
|
"WRITE", C_WRITE,
|
||||||
|
# endif
|
||||||
|
"append", C_APPEND,
|
||||||
|
"branch", C_BRANCH,
|
||||||
|
"cd", C_CHDIR,
|
||||||
|
"chdir", C_CHDIR,
|
||||||
|
"date", C_TIME,
|
||||||
|
"ed", C_EDIT,
|
||||||
|
"edit", C_EDIT,
|
||||||
|
"editor", C_EDIT,
|
||||||
|
"eval", C_EVAL,
|
||||||
|
"go", C_GO,
|
||||||
|
"help", C_S_HELP,
|
||||||
|
"HELP", C_L_HELP,
|
||||||
|
"include", C_INCLUDE,
|
||||||
|
"list", C_LIST,
|
||||||
|
"mark", C_MARK,
|
||||||
|
"monitor", C_MONITOR,
|
||||||
|
"print", C_PRINT,
|
||||||
|
"quit", C_QUIT,
|
||||||
|
"read", C_INCLUDE,
|
||||||
|
"reset", C_RESET,
|
||||||
|
"sh", C_SHELL,
|
||||||
|
"shell", C_SHELL,
|
||||||
|
"time", C_TIME,
|
||||||
|
"write", C_WRITE,
|
||||||
|
(char *) 0
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** MONITOR
|
||||||
|
**
|
||||||
|
** This routine maintains the logical query buffer in
|
||||||
|
** QRYBUFxxxx. It in general just does a copy from input
|
||||||
|
** to query buffer, unless it gets a backslash escape character.
|
||||||
|
** It recognizes the following escapes:
|
||||||
|
**
|
||||||
|
** \a -- force append mode (no autoclear)
|
||||||
|
** \b -- branch (within an include file only)
|
||||||
|
** \cd-- change working directory
|
||||||
|
** \d -- print current time
|
||||||
|
** \e -- enter editor
|
||||||
|
** \g -- "GO": submit query to DBS
|
||||||
|
** \h -- short help
|
||||||
|
** \H -- long help
|
||||||
|
** \i -- include (switch input to external file)
|
||||||
|
** \k -- mark (for \b)
|
||||||
|
** \l -- list: print query buffer after macro evaluation
|
||||||
|
** \m -- set monitor command character
|
||||||
|
** \p -- print query buffer (before macro evaluation)
|
||||||
|
** \q -- quit DBS
|
||||||
|
** \r -- force reset (clear) of query buffer
|
||||||
|
** \s -- call shell
|
||||||
|
** \v -- evaluate macros, but throw away result (for side effects)
|
||||||
|
** \w -- write query buffer to external file
|
||||||
|
** \\ -- produce a single backslash in query buffer
|
||||||
|
*/
|
||||||
|
command()
|
||||||
|
{
|
||||||
|
register int chr;
|
||||||
|
register int controlno;
|
||||||
|
register char *p;
|
||||||
|
long timevec;
|
||||||
|
extern char *getfilename();
|
||||||
|
extern long time();
|
||||||
|
extern char *ctime();
|
||||||
|
|
||||||
|
while (chr = getch())
|
||||||
|
{
|
||||||
|
if (chr == Escape)
|
||||||
|
{
|
||||||
|
/* process control sequence */
|
||||||
|
if (!(controlno = getescape(TRUE)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (controlno)
|
||||||
|
{
|
||||||
|
case C_S_HELP:
|
||||||
|
case C_L_HELP:
|
||||||
|
shorthelp(controlno == C_S_HELP);
|
||||||
|
cgprompt();
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_EDIT:
|
||||||
|
edit();
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_LIST:
|
||||||
|
# ifdef MACRO
|
||||||
|
eval(TRUE);
|
||||||
|
continue;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
case C_EVAL:
|
||||||
|
# ifdef MACRO
|
||||||
|
eval(FALSE);
|
||||||
|
Autoclear = TRUE;
|
||||||
|
continue;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
case C_PRINT:
|
||||||
|
print(TRUE);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_INCLUDE:
|
||||||
|
include((char *) 0);
|
||||||
|
cgprompt();
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_WRITE:
|
||||||
|
writeout();
|
||||||
|
cgprompt();
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_CHDIR:
|
||||||
|
newdirec();
|
||||||
|
cgprompt();
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_RESET:
|
||||||
|
clear(TRUE);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_GO:
|
||||||
|
go();
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_QUIT:
|
||||||
|
clrline(TRUE);
|
||||||
|
quit();
|
||||||
|
|
||||||
|
case C_SHELL:
|
||||||
|
shell();
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_TIME:
|
||||||
|
time(&timevec);
|
||||||
|
# ifdef ESER_VMX
|
||||||
|
printf("%s", ctime(timevec));
|
||||||
|
# else
|
||||||
|
printf("%s", ctime(&timevec));
|
||||||
|
# endif
|
||||||
|
clrline(FALSE);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_APPEND:
|
||||||
|
Autoclear = 0;
|
||||||
|
clrline(FALSE);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_MARK:
|
||||||
|
getfilename();
|
||||||
|
prompt((char *) 0);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_MONITOR:
|
||||||
|
p = getfilename();
|
||||||
|
Escape = *p? *p: ESCAPE;
|
||||||
|
prompt((char *) 0);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case C_BRANCH:
|
||||||
|
branch();
|
||||||
|
prompt((char *) 0);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
default:
|
||||||
|
AAsyserr(16020, controlno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
putch(chr);
|
||||||
|
}
|
||||||
|
if (Input == stdin)
|
||||||
|
{
|
||||||
|
if (Nodayfile >= 0)
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fclose(Input);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getescape(copy)
|
||||||
|
register int copy;
|
||||||
|
{
|
||||||
|
register struct cntrlwd *cw;
|
||||||
|
register char *word;
|
||||||
|
extern char *getname();
|
||||||
|
|
||||||
|
word = getname();
|
||||||
|
for (cw = Controlwords; cw->name; cw++)
|
||||||
|
if (AAsequal(cw->name, word))
|
||||||
|
return (cw->code);
|
||||||
|
|
||||||
|
/* not found -- pass symbol through and return failure */
|
||||||
|
if (!copy)
|
||||||
|
return (0);
|
||||||
|
putch(Escape);
|
||||||
|
while (*word)
|
||||||
|
{
|
||||||
|
putch(*word);
|
||||||
|
word++;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *getname()
|
||||||
|
{
|
||||||
|
static char buf[FILENAME + 1];
|
||||||
|
register char *p;
|
||||||
|
register int len;
|
||||||
|
register int c;
|
||||||
|
|
||||||
|
for (p = buf, len = 0; len < FILENAME; len++)
|
||||||
|
if (((c = getch()) >= 'a'
|
||||||
|
# ifdef EBCDIC
|
||||||
|
&& c <= 'i') || (c >= 'j'
|
||||||
|
&& c <= 'r') || (c >= 's'
|
||||||
|
# endif
|
||||||
|
&& c <= 'z') || (c >= 'A'
|
||||||
|
# ifdef EBCDIC
|
||||||
|
&& c <= 'I') || (c >= 'J'
|
||||||
|
&& c <= 'R') || (c >= 'S'
|
||||||
|
# endif
|
||||||
|
&& c <= 'Z'))
|
||||||
|
*p++ = c;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Peekch = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p = 0;
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
putch(c)
|
||||||
|
register int c;
|
||||||
|
{
|
||||||
|
Prompt = Newline = (c == '\n');
|
||||||
|
if (c < ' ' && c != '\n' && c != '\t')
|
||||||
|
{
|
||||||
|
printf("%sZeichen '0%o' konvertiert in Blank\n", ERROR, c);
|
||||||
|
c = ' ';
|
||||||
|
}
|
||||||
|
prompt((char *) 0);
|
||||||
|
if (Autoclear)
|
||||||
|
clear(FALSE);
|
||||||
|
putc(c, Qryiop);
|
||||||
|
Notnull++;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,994 @@
|
||||||
|
/*
|
||||||
|
** This file contains the specification of QL recognized by the parser.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* COMMANDS */
|
||||||
|
%term APPEND COPY CREATE DELETE DESTROY HELP INDEX MODIFY
|
||||||
|
%term PRINT RANGE REPLACE RETRIEVE SAVE
|
||||||
|
%term DEFINE PERMIT VIEW INTEGRITY
|
||||||
|
/*DDD*/%term DISTRIBUTE
|
||||||
|
|
||||||
|
/* 'NOISE' WORDS */
|
||||||
|
%term ALL BY FROM IN INTO UNIQUE AT
|
||||||
|
%term IS OF ON TO UNTIL WHERE
|
||||||
|
/*DDD*/%term DISTRD
|
||||||
|
|
||||||
|
/* CONSTANTS */
|
||||||
|
%term NAME SCONST I2CONST I4CONST F4CONST F8CONST
|
||||||
|
|
||||||
|
/* PUNCTUATION */
|
||||||
|
%term COMMA LPAREN PERIOD RPAREN COLON BGNCMNT ENDCMNT
|
||||||
|
|
||||||
|
/* UNARY ARITHMETIC OPERATORS */
|
||||||
|
%term UAOP
|
||||||
|
|
||||||
|
/* BINARY ARITHMETIC OPERATORS */
|
||||||
|
%term BAOP BAOPH
|
||||||
|
|
||||||
|
/* BOUNDS OPERATORS */
|
||||||
|
%term BDOP
|
||||||
|
|
||||||
|
/* EQUALITY OPERATORS */
|
||||||
|
%term EOP
|
||||||
|
|
||||||
|
/* LOGICAL OPERATORS */
|
||||||
|
%term LBOP LUOP
|
||||||
|
|
||||||
|
/* FUNCTIONAL OPERATORS */
|
||||||
|
%term FOP FBOP
|
||||||
|
|
||||||
|
/* AGGREGATE OPERATORS */
|
||||||
|
%term AGOP
|
||||||
|
|
||||||
|
|
||||||
|
/* DEFINE ASCENDING PRECEDENCE FOR OPERATORS */
|
||||||
|
%left LBOP
|
||||||
|
%left LUOP
|
||||||
|
%left UAOP
|
||||||
|
%left BAOP
|
||||||
|
%left BAOPH
|
||||||
|
%binary unaryop
|
||||||
|
|
||||||
|
%{
|
||||||
|
/* SCANNER/PARSER GLOBALS & TABLES */
|
||||||
|
# include "gen.h"
|
||||||
|
# include "../h/dbs.h"
|
||||||
|
# include "../h/aux.h"
|
||||||
|
# include "../h/tree.h"
|
||||||
|
# include "../h/symbol.h"
|
||||||
|
# include "parser.h"
|
||||||
|
|
||||||
|
struct rngtab *Resrng; /* ptr to result reln entry */
|
||||||
|
QTREE *Lastree; /* pointer to root node of tree */
|
||||||
|
DESC Reldesc; /* descriptor for range table lookup */
|
||||||
|
short Rsdmno; /* result domain number */
|
||||||
|
int Opflag; /* operator flag contains query mode */
|
||||||
|
char *Indexname; /* ptr to name of index */
|
||||||
|
char *Trname; /* pointer to attribute name */
|
||||||
|
int Agflag; /* how many aggs in this qry */
|
||||||
|
int Patflag; /* signals a pattern match reduction */
|
||||||
|
int Qlflag; /* set when processing a qual */
|
||||||
|
int yyline; /* line counter */
|
||||||
|
short Permcomd;
|
||||||
|
|
||||||
|
static QTREE *Tidnode; /* pointer to tid node of targ list
|
||||||
|
for REPLACE, DELETE */
|
||||||
|
%}
|
||||||
|
%%
|
||||||
|
%{
|
||||||
|
register int i;
|
||||||
|
register struct atstash *aptr;
|
||||||
|
register char *p;
|
||||||
|
char permbuf[3];
|
||||||
|
extern char *AA_iocv();
|
||||||
|
extern char *AAztack();
|
||||||
|
extern QTREE *tree();
|
||||||
|
extern char *tlprepend();
|
||||||
|
extern char *addresdom();
|
||||||
|
extern char *xdot();
|
||||||
|
extern char *norml();
|
||||||
|
extern struct atstash *attlookup();
|
||||||
|
extern struct rngtab *rngent();
|
||||||
|
extern struct rngtab *rnglook();
|
||||||
|
/* space for two names, their null bytes and the seperator */
|
||||||
|
char modbuf[(2 * (MAXNAME + 1)) + 1];
|
||||||
|
static char hqmbuf[2];
|
||||||
|
%}
|
||||||
|
program: xprogram
|
||||||
|
| /* empty */
|
||||||
|
;
|
||||||
|
xprogram: xprogram stmnt =
|
||||||
|
{
|
||||||
|
endqlst(Opflag);
|
||||||
|
}
|
||||||
|
| stmnt =
|
||||||
|
{
|
||||||
|
endqlst(Opflag);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
stmnt: append
|
||||||
|
| copy
|
||||||
|
| create
|
||||||
|
| delete
|
||||||
|
| destroy
|
||||||
|
/*DDD*/ | distribute
|
||||||
|
| help
|
||||||
|
| index
|
||||||
|
| integrity
|
||||||
|
| modify
|
||||||
|
| permit
|
||||||
|
| print
|
||||||
|
| range
|
||||||
|
| replace
|
||||||
|
| retrieve
|
||||||
|
| save
|
||||||
|
| view
|
||||||
|
;
|
||||||
|
range: rngvar
|
||||||
|
| rngprint =
|
||||||
|
{
|
||||||
|
rngprint();
|
||||||
|
}
|
||||||
|
;
|
||||||
|
rngprint: rngstmnt
|
||||||
|
;
|
||||||
|
rngvar: rngstmnt rngof NAME IS NAME =
|
||||||
|
{
|
||||||
|
if ((i = AArelopen(&Reldesc, -1, $5)) < 0)
|
||||||
|
AAsyserr(18012, i);
|
||||||
|
if (i > 0)
|
||||||
|
/* invalid relation name */
|
||||||
|
yyerror(RNGEXIST, $5, (char *) 0);
|
||||||
|
rngent(R_EXTERNAL, $3, $5, Reldesc.reldum.relowner,
|
||||||
|
Reldesc.reldum.relatts, Reldesc.reldum.relstat);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
rngstmnt: RANGE =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdRANGE;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
rngof: OF
|
||||||
|
| /* empty */
|
||||||
|
;
|
||||||
|
append: apstmnt apto relation tlclause qualclause =
|
||||||
|
{
|
||||||
|
/* make root node */
|
||||||
|
Lastree = tree($4, $5, ROOT, 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
apstmnt: APPEND =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdAPP;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
apto: TO
|
||||||
|
| /* empty */
|
||||||
|
;
|
||||||
|
delete: delstmnt relation qualclause =
|
||||||
|
{
|
||||||
|
/* make root node for delete, with a TIDNODE at leftmost */
|
||||||
|
Lastree = tree(tree((QTREE *) 0, Tidnode, RESDOM, RES_SIZ, (char *) 0), $3, ROOT, 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
delstmnt: DELETE =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdDEL;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
replace: repstmnt relation tlclause qualclause =
|
||||||
|
{
|
||||||
|
/* make root node for replace */
|
||||||
|
Lastree = tree($3, $4, ROOT, 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
repstmnt: REPLACE =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdREPL;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
retrieve: retstmnt retclause tlclause qualclause =
|
||||||
|
{
|
||||||
|
/* make root node for retrieve */
|
||||||
|
Lastree = tree($3, $4, ROOT, 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
retstmnt: RETRIEVE =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdRETR;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
retclause: retkwd relation =
|
||||||
|
{
|
||||||
|
/* set up pipe block and save relname for create */
|
||||||
|
Rsdmno = 0;
|
||||||
|
setp("0"); /* relstat = nil */
|
||||||
|
setp(Resrng->relnm);
|
||||||
|
}
|
||||||
|
| /* empty */ =
|
||||||
|
{
|
||||||
|
/* no result relation, output to terminal */
|
||||||
|
Rsdmno = 0;
|
||||||
|
Resrng = 0;
|
||||||
|
}
|
||||||
|
| UNIQUE =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdRET_UNI;
|
||||||
|
Rsdmno = 0;
|
||||||
|
Resrng = 0;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
retkwd: INTO
|
||||||
|
| /* empty */
|
||||||
|
;
|
||||||
|
view: viewclause tlclause qualclause =
|
||||||
|
{
|
||||||
|
Lastree = tree($2, $3, ROOT, 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
viewclause: viewstmnt relation =
|
||||||
|
{
|
||||||
|
Rsdmno = 0;
|
||||||
|
setp("0040"); /* relstat = S_VIEW */
|
||||||
|
setp(Resrng->relnm);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
viewstmnt: DEFINE VIEW =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdVIEW;
|
||||||
|
if (!Qrymod)
|
||||||
|
/* no qrymod in database */
|
||||||
|
yyerror(NOQRYMOD, (char *) 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permit: permstmnt permlist permrel permtarg permwho permplace permtd qualclause =
|
||||||
|
{
|
||||||
|
Lastree = tree($4, $8, ROOT, 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permstmnt: DEFINE PERMIT =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdPROT;
|
||||||
|
if (!Qrymod)
|
||||||
|
/* no qrymod in database */
|
||||||
|
yyerror(NOQRYMOD, (char *) 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permlist: permxlist
|
||||||
|
| permlist COMMA permxlist
|
||||||
|
;
|
||||||
|
permxlist: ALL =
|
||||||
|
{
|
||||||
|
permcom(-1); /* means 'all' commands */
|
||||||
|
}
|
||||||
|
| RETRIEVE =
|
||||||
|
{
|
||||||
|
permcom((int) mdRETR);
|
||||||
|
}
|
||||||
|
| DELETE =
|
||||||
|
{
|
||||||
|
permcom((int) mdDEL);
|
||||||
|
}
|
||||||
|
| APPEND =
|
||||||
|
{
|
||||||
|
permcom((int) mdAPP);
|
||||||
|
}
|
||||||
|
| REPLACE =
|
||||||
|
{
|
||||||
|
permcom((int) mdREPL);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permrel: permword relation =
|
||||||
|
{
|
||||||
|
/* put command vector into list now since this always happens */
|
||||||
|
setp(AA_iocv(Permcomd));
|
||||||
|
Permcomd = 0; /* reset command map */
|
||||||
|
setp(Resrng->relnm);
|
||||||
|
AAbmove(Resrng->relnowner, permbuf, 2);
|
||||||
|
permbuf[2] = 0;
|
||||||
|
setp(permbuf);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permword: ON
|
||||||
|
| OF
|
||||||
|
| TO
|
||||||
|
;
|
||||||
|
permtarg: LPAREN permtlist RPAREN =
|
||||||
|
{
|
||||||
|
$$ = $2;
|
||||||
|
}
|
||||||
|
| /* empty */ =
|
||||||
|
{
|
||||||
|
$$ = (char *) 0;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permtlist: permtlelm
|
||||||
|
| permtlist COMMA permtlelm =
|
||||||
|
{
|
||||||
|
/* attach bulk of permit tl to leftmost node of new elem */
|
||||||
|
$$ = tlprepend($1, $3);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permtlelm: NAME =
|
||||||
|
{
|
||||||
|
/* Resrng is set by the AA_REL production */
|
||||||
|
Trname = $1;
|
||||||
|
aptr = attlookup(Resrng, Trname);
|
||||||
|
$$ = (char *) tree((QTREE *) 0, (QTREE *) 0, VAR, VAR_SIZ, CAST(Resrng->rentno), aptr);
|
||||||
|
$$ = (char *) addresdom((QTREE *) 0, $$);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permwho: TO NAME =
|
||||||
|
{
|
||||||
|
setp($2);
|
||||||
|
}
|
||||||
|
| TO ALL =
|
||||||
|
{
|
||||||
|
setp("all");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permplace: AT NAME =
|
||||||
|
{
|
||||||
|
setp($2);
|
||||||
|
}
|
||||||
|
| AT ALL =
|
||||||
|
{
|
||||||
|
setp("all");
|
||||||
|
}
|
||||||
|
| /* empty */ =
|
||||||
|
{
|
||||||
|
setp("all"); /* default is all */
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permtd: permtime permday
|
||||||
|
| permdeftime permday
|
||||||
|
| permtime permdefday
|
||||||
|
| permdeftime permdefday
|
||||||
|
;
|
||||||
|
permdeftime: /* empty */ =
|
||||||
|
{
|
||||||
|
setp("0");
|
||||||
|
setp("1440");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permdefday: /* empty */ =
|
||||||
|
{
|
||||||
|
setp("sun");
|
||||||
|
setp("sat");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permtime: FROM I2CONST COLON I2CONST TO I2CONST COLON I2CONST =
|
||||||
|
{
|
||||||
|
setp(AA_iocv(timeofday($2, $4)));
|
||||||
|
setp(AA_iocv(timeofday($6, $8)));
|
||||||
|
}
|
||||||
|
;
|
||||||
|
permday: ON NAME TO NAME =
|
||||||
|
{
|
||||||
|
setp($2);
|
||||||
|
setp($4);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
integrity: integstmnt integnoise relation integis qual =
|
||||||
|
{
|
||||||
|
Lastree = tree((QTREE *) 0, norml($5), ROOT, 0);
|
||||||
|
Qlflag--; /* turn off here */
|
||||||
|
}
|
||||||
|
;
|
||||||
|
integstmnt: DEFINE INTEGRITY =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdINTEG;
|
||||||
|
Qlflag++; /* OK to turn on here because integrity doesn't have a targ list */
|
||||||
|
if (!Qrymod)
|
||||||
|
/* no qrymod in database */
|
||||||
|
yyerror(NOQRYMOD, (char *) 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
integnoise: ON
|
||||||
|
| /* empty */
|
||||||
|
;
|
||||||
|
integis: IS
|
||||||
|
| /* empty */
|
||||||
|
;
|
||||||
|
/*DDD*/distribute: diststmnt relation AT distcrits =
|
||||||
|
/*DDD*/ {
|
||||||
|
/*DDD*/ $$ = (char *) tree((QTREE *) 0, (QTREE *) 0, QLEND, 0);
|
||||||
|
/*DDD*/ Lastree = tree($4, $$, ROOT, 0);
|
||||||
|
/*DDD*/ }
|
||||||
|
/*DDD*/;
|
||||||
|
/*DDD*/diststmnt: DISTRIBUTE =
|
||||||
|
/*DDD*/ Opflag = mdDISTRIB;
|
||||||
|
/*DDD*/;
|
||||||
|
/*DDD*/distcrits: dcriterion =
|
||||||
|
/*DDD*/ {
|
||||||
|
/*DDD*/ $$ = $1;
|
||||||
|
/*DDD*/ }
|
||||||
|
/*DDD*/ | distcrits dcriterion =
|
||||||
|
/*DDD*/ {
|
||||||
|
/*DDD*/ $$ = tlprepend($1, $2);
|
||||||
|
/*DDD*/ }
|
||||||
|
/*DDD*/;
|
||||||
|
/*DDD*/dcriterion: NAME where qual =
|
||||||
|
/*DDD*/ {
|
||||||
|
/*DDD*/ Qlflag--;
|
||||||
|
/*DDD*/ $$ = (char *) tree((QTREE *) 0, norml($3), SITE, OP_SIZ, $1);
|
||||||
|
/*DDD*/ }
|
||||||
|
/*DDD*/;
|
||||||
|
relation: NAME =
|
||||||
|
{
|
||||||
|
# ifdef xPTR2
|
||||||
|
AAtTfp(32, 0, "res rel name/var: '%s'\n", $1);
|
||||||
|
# endif
|
||||||
|
switch (Opflag)
|
||||||
|
{
|
||||||
|
case mdRETR:
|
||||||
|
case mdVIEW:
|
||||||
|
/* result better not be a rel name */
|
||||||
|
if ((i = AArelopen(&Reldesc, -1, $1)) < 0)
|
||||||
|
AAsyserr(18013, i);
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
/* reln exists */
|
||||||
|
if (AAbequal(Reldesc.reldum.relowner, AAusercode, 2))
|
||||||
|
{
|
||||||
|
/* same owner, can't duplicate name */
|
||||||
|
yyerror(RESEXIST, $1, (char *) 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* owned by dba -- purge range table */
|
||||||
|
rngdel($1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Resrng = rngent(R_INTERNAL, "", $1, AAusercode, 0, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case mdAPP:
|
||||||
|
/* result is a rel name */
|
||||||
|
Resrng = rnglook($1, LOOKREL);
|
||||||
|
if (Resrng == 0)
|
||||||
|
{
|
||||||
|
if ((i = AArelopen(&Reldesc, -1, $1)) < 0)
|
||||||
|
AAsyserr(18013, i);
|
||||||
|
if (i)
|
||||||
|
/* invalid relation name */
|
||||||
|
yyerror(RESAPPEX, $1, (char *) 0);
|
||||||
|
Resrng = rngent(R_INTERNAL, "", $1,
|
||||||
|
Reldesc.reldum.relowner,
|
||||||
|
Reldesc.reldum.relatts,
|
||||||
|
Reldesc.reldum.relstat);
|
||||||
|
}
|
||||||
|
checkupd(Resrng);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case mdPROT:
|
||||||
|
case mdINTEG:
|
||||||
|
# ifdef DISTRIB
|
||||||
|
case mdDISTRIB:
|
||||||
|
# endif
|
||||||
|
/* the result is a tuple variable */
|
||||||
|
Resrng = rnglook($1, LOOKVAR);
|
||||||
|
if (Resrng == 0)
|
||||||
|
/* variable not declared */
|
||||||
|
yyerror(NOVBLE, $1, (char *) 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case mdREPL:
|
||||||
|
case mdDEL:
|
||||||
|
/* the result is a tuple variable */
|
||||||
|
Resrng = rnglook($1, LOOKVAR);
|
||||||
|
if (Resrng == 0)
|
||||||
|
/* variable not declared */
|
||||||
|
yyerror(NOVBLE, $1, (char *) 0);
|
||||||
|
checkupd(Resrng);
|
||||||
|
Tidnode = tree((QTREE *) 0, (QTREE *) 0, VAR, VAR_SIZ, CAST(Resrng->rentno), &Faketid);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
;
|
||||||
|
tlclause: LPAREN tlist RPAREN =
|
||||||
|
{
|
||||||
|
if (Patflag)
|
||||||
|
/* no patt match in targ list */
|
||||||
|
yyerror(NOPATMAT, (char *) 0);
|
||||||
|
$$ = $2;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** replace must have tid node as left branch
|
||||||
|
** (so does delete but it doesn't have a targ list)
|
||||||
|
*/
|
||||||
|
if (Opflag == (int) mdREPL)
|
||||||
|
{
|
||||||
|
$$ = tlprepend(tree((QTREE *) 0, Tidnode, RESDOM, RES_SIZ, (char *) 0), $$);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
;
|
||||||
|
tlist: tlelm
|
||||||
|
| tlist COMMA tlelm =
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
** attach bulk of targ list to leftmost node
|
||||||
|
** of new element
|
||||||
|
*/
|
||||||
|
$$ = tlprepend($1, $3);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
tlelm: NAME is afcn =
|
||||||
|
{
|
||||||
|
Trname = $1;
|
||||||
|
/* make a new resdom entry for targ list */
|
||||||
|
$$ = (char *) addresdom((QTREE *) 0, $3);
|
||||||
|
}
|
||||||
|
| attrib =
|
||||||
|
{
|
||||||
|
/* makes a new resdom entry for targ list */
|
||||||
|
$$ = (char *) addresdom((QTREE *) 0, $1);
|
||||||
|
}
|
||||||
|
| var PERIOD ALL =
|
||||||
|
{
|
||||||
|
if (Opflag == (int) mdREPL)
|
||||||
|
/* ALL not defined for REPLACE */
|
||||||
|
yyerror(REPALL, ((struct rngtab *) $1)->varname, (char *) 0);
|
||||||
|
/* makes set of new resdom entries for targ list */
|
||||||
|
$$ = xdot($1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
is: IS
|
||||||
|
| BY
|
||||||
|
;
|
||||||
|
qualclause: where qual =
|
||||||
|
{
|
||||||
|
# ifdef xPTM
|
||||||
|
if (AAtTf(76, 2))
|
||||||
|
timtrace(25, 0);
|
||||||
|
# endif
|
||||||
|
$$ = norml($2);
|
||||||
|
Qlflag--;
|
||||||
|
# ifdef xPTM
|
||||||
|
if (AAtTf(76, 2))
|
||||||
|
timtrace(26, 0);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
| /* empty */ =
|
||||||
|
{
|
||||||
|
/* null qualification */
|
||||||
|
$$ = norml((QTREE *) 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
where: WHERE =
|
||||||
|
{
|
||||||
|
Qlflag++;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
qual: LPAREN qual RPAREN =
|
||||||
|
{
|
||||||
|
$$ = $2;
|
||||||
|
}
|
||||||
|
| LUOP qual =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree((QTREE *) 0, $2, UOP, OP_SIZ, $1);
|
||||||
|
}
|
||||||
|
| qual LBOP qual =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree($1, $3, $2, 0, (char *) 0);
|
||||||
|
}
|
||||||
|
| clause
|
||||||
|
;
|
||||||
|
clause: afcn relop afcn =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree($1, $3, BOP, OP_SIZ, $2);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
relop: EOP
|
||||||
|
| IS
|
||||||
|
| BDOP
|
||||||
|
;
|
||||||
|
afcn: aggrfcn =
|
||||||
|
{
|
||||||
|
Agflag++;
|
||||||
|
}
|
||||||
|
| attribfcn
|
||||||
|
| afcn BAOPH afcn =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree($1, $3, BOP, OP_SIZ, $2);
|
||||||
|
}
|
||||||
|
| afcn BAOP afcn =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree($1, $3, BOP, OP_SIZ, $2);
|
||||||
|
}
|
||||||
|
| afcn UAOP afcn =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree($1, $3, BOP, OP_SIZ, $2);
|
||||||
|
}
|
||||||
|
| LPAREN afcn RPAREN =
|
||||||
|
{
|
||||||
|
$$ = $2;
|
||||||
|
}
|
||||||
|
| uop afcn %prec unaryop =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree((QTREE *) 0, $2, UOP, OP_SIZ, $1);
|
||||||
|
}
|
||||||
|
| FOP LPAREN afcn RPAREN =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree($3, (QTREE *) 0, UOP, OP_SIZ, $1);
|
||||||
|
}
|
||||||
|
| FBOP LPAREN afcn COMMA afcn RPAREN =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree($3, $5, BOP, OP_SIZ, $1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
aggrfcn: AGOP LPAREN afcn BY domseq qualclause RPAREN =
|
||||||
|
{
|
||||||
|
# ifdef xPTR2
|
||||||
|
AAtTfp(35, 0, "agg func\n");
|
||||||
|
# endif
|
||||||
|
windup($5);
|
||||||
|
$$ = (char *) tree(tree($5, tree((QTREE *) 0, $3, AOP, AOP_SIZ, $1), BYHEAD, 0, (char *) 0), $6, AGHEAD, 0, (char *) 0);
|
||||||
|
}
|
||||||
|
| AGOP LPAREN afcn qualclause RPAREN =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree(tree((QTREE *) 0, $3, AOP, AOP_SIZ, $1), $4, AGHEAD, 0, (char *) 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
domseq: targdom
|
||||||
|
| domseq COMMA targdom =
|
||||||
|
{
|
||||||
|
$$ = tlprepend($1, $3);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
targdom: afcn =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree((QTREE *) 0, $1, RESDOM, RES_SIZ, CAST(Rsdmno));
|
||||||
|
}
|
||||||
|
;
|
||||||
|
attrib: var PERIOD NAME =
|
||||||
|
{
|
||||||
|
# ifdef xPTR2
|
||||||
|
AAtTfp(37, 0, "attrib %s.%s found\n", ((struct rngtab *) $1)->varname, $3);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* remember attribute name */
|
||||||
|
Trname = $3;
|
||||||
|
|
||||||
|
/* look up attribute */
|
||||||
|
aptr = attlookup($1, Trname);
|
||||||
|
$$ = (char *) tree((QTREE *) 0, (QTREE *) 0, VAR, VAR_SIZ, CAST(((struct rngtab *) $1)->rentno), aptr);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
var: NAME =
|
||||||
|
{
|
||||||
|
$$ = (char *) rnglook($1, LOOKVAR);
|
||||||
|
if ($$ == 0)
|
||||||
|
/* variable not declared */
|
||||||
|
yyerror(NOVBLE, $1, (char *) 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
attribfcn: I2CONST =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree((QTREE *) 0, (QTREE *) 0, INT, sizeof (short), $1);
|
||||||
|
}
|
||||||
|
| I4CONST =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree((QTREE *) 0, (QTREE *) 0, INT, sizeof (long), $1);
|
||||||
|
}
|
||||||
|
| F4CONST =
|
||||||
|
{
|
||||||
|
# ifdef NO_F4
|
||||||
|
goto f8_tree;
|
||||||
|
# else
|
||||||
|
$$ = (char *) tree((QTREE *) 0, (QTREE *) 0, FLOAT, sizeof (float), $1);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
| F8CONST =
|
||||||
|
{
|
||||||
|
f8_tree:
|
||||||
|
$$ = (char *) tree((QTREE *) 0, (QTREE *) 0, FLOAT, sizeof (double), $1);
|
||||||
|
}
|
||||||
|
| SCONST =
|
||||||
|
{
|
||||||
|
if (patmat($1) && !Qlflag)
|
||||||
|
Patflag = 1;
|
||||||
|
$$ = (char *) tree((QTREE *) 0, (QTREE *) 0, CHAR, AAlength($1), $1);
|
||||||
|
}
|
||||||
|
| NAME =
|
||||||
|
{
|
||||||
|
$$ = (char *) tree((QTREE *) 0, (QTREE *) 0, COP, OP_SIZ, $1);
|
||||||
|
}
|
||||||
|
| attrib
|
||||||
|
;
|
||||||
|
uop: UAOP %prec unaryop =
|
||||||
|
{
|
||||||
|
if ($1 == (char *) ((int) opADD))
|
||||||
|
$$ = (char *) ((int) opPLUS);
|
||||||
|
else
|
||||||
|
if ($1 == (char *) ((int) opSUB))
|
||||||
|
$$ = (char *) ((int) opMINUS);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
copy: copstmnt alias LPAREN coparam RPAREN keywd SCONST =
|
||||||
|
{
|
||||||
|
# ifdef xPTR2
|
||||||
|
AAtTfp(41, 0, "copy %s,%s\n", $2, $7);
|
||||||
|
# endif
|
||||||
|
setp($7);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
copstmnt: COPY =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdCOPY;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
coparam: cospecs
|
||||||
|
| /* empty */
|
||||||
|
;
|
||||||
|
cospecs: alias is coent
|
||||||
|
| cospecs COMMA alias is coent
|
||||||
|
;
|
||||||
|
coent: alias
|
||||||
|
| SCONST =
|
||||||
|
{
|
||||||
|
setp($1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
alias: NAME =
|
||||||
|
{
|
||||||
|
setp($1);
|
||||||
|
if (Opflag == (int) mdDESTROY
|
||||||
|
# ifdef DISTRIB
|
||||||
|
|| Opflag == mdDCREATE
|
||||||
|
# endif
|
||||||
|
|| Opflag == (int) mdCREATE)
|
||||||
|
rngdel($1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
specs: alias is alias
|
||||||
|
| specs COMMA alias is alias
|
||||||
|
;
|
||||||
|
keywd: INTO =
|
||||||
|
{
|
||||||
|
setp("\0");
|
||||||
|
setp("i");
|
||||||
|
}
|
||||||
|
| FROM =
|
||||||
|
{
|
||||||
|
setp("\0");
|
||||||
|
setp("f");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
create: crestmnt alias LPAREN specs RPAREN
|
||||||
|
;
|
||||||
|
crestmnt: CREATE =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdCREATE;
|
||||||
|
|
||||||
|
/* set up parameters for regular create */
|
||||||
|
setp("0"); /* relstat = nil */
|
||||||
|
}
|
||||||
|
/*DDD*/ | CREATE DISTRD =
|
||||||
|
/*DDD*/ {
|
||||||
|
/*DDD*/ Opflag = mdDCREATE;
|
||||||
|
/*DDD*/
|
||||||
|
/*DDD*/ /* setup parameters for distributed create */
|
||||||
|
/*DDD*/ setp("U");
|
||||||
|
/*DDD*/ setp("");
|
||||||
|
/*DDD*/ setp("01000"); /* relstat = S_DISTRIBUTED */
|
||||||
|
/*DDD*/ }
|
||||||
|
;
|
||||||
|
destroy: destmnt keys
|
||||||
|
| destqm destlist
|
||||||
|
;
|
||||||
|
destmnt: DESTROY =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdDESTROY;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
destqm: destmnt INTEGRITY NAME =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdREMQM;
|
||||||
|
if (!Qrymod)
|
||||||
|
/* no qrymod in database */
|
||||||
|
yyerror(NOQRYMOD, (char *) 0);
|
||||||
|
setp("6");
|
||||||
|
setp($3);
|
||||||
|
}
|
||||||
|
| destmnt PERMIT NAME =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdREMQM;
|
||||||
|
if (!Qrymod)
|
||||||
|
/* no qrymod in database */
|
||||||
|
yyerror(NOQRYMOD, (char *) 0);
|
||||||
|
setp("5");
|
||||||
|
setp($3);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
destlist: I2CONST =
|
||||||
|
{
|
||||||
|
setp(AA_iocv(((I2TYPE *) $1)->i2type));
|
||||||
|
}
|
||||||
|
| destlist COMMA I2CONST =
|
||||||
|
{
|
||||||
|
setp(AA_iocv(((I2TYPE *) $3)->i2type));
|
||||||
|
}
|
||||||
|
| ALL
|
||||||
|
;
|
||||||
|
help: helstmnt hlist
|
||||||
|
| helstmnt =
|
||||||
|
{
|
||||||
|
setp("2"); /* all relns */
|
||||||
|
}
|
||||||
|
| helqmstmnt hqmlist
|
||||||
|
;
|
||||||
|
helstmnt: HELP =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdHELP;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
helqmstmnt: HELP VIEW =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdDISPLAY;
|
||||||
|
if (!Qrymod)
|
||||||
|
/* no qrymod in database */
|
||||||
|
yyerror(NOQRYMOD, (char *) 0);
|
||||||
|
AAsmove("4", hqmbuf);
|
||||||
|
}
|
||||||
|
| HELP PERMIT =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdDISPLAY;
|
||||||
|
if (!Qrymod)
|
||||||
|
/* no qrymod in database */
|
||||||
|
yyerror(NOQRYMOD, (char *) 0);
|
||||||
|
AAsmove("5", hqmbuf);
|
||||||
|
}
|
||||||
|
| HELP INTEGRITY =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdDISPLAY;
|
||||||
|
if (!Qrymod) /* no qrymod in database */
|
||||||
|
yyerror(NOQRYMOD, (char *) 0);
|
||||||
|
AAsmove("6", hqmbuf);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
hlist: hparam
|
||||||
|
| hlist COMMA hparam
|
||||||
|
| ALL =
|
||||||
|
{
|
||||||
|
setp("3");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
hparam: NAME =
|
||||||
|
{
|
||||||
|
/* relation */
|
||||||
|
setp("0");
|
||||||
|
setp($1);
|
||||||
|
}
|
||||||
|
| SCONST =
|
||||||
|
{
|
||||||
|
/* manual page */
|
||||||
|
setp("1");
|
||||||
|
setp($1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
hqmlist: NAME =
|
||||||
|
{
|
||||||
|
setp(hqmbuf);
|
||||||
|
setp($1);
|
||||||
|
}
|
||||||
|
| hqmlist COMMA NAME =
|
||||||
|
{
|
||||||
|
setp(hqmbuf);
|
||||||
|
setp($3);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
index: instmnt LPAREN keys RPAREN =
|
||||||
|
{
|
||||||
|
if (Rsdmno > MAXKEYS)
|
||||||
|
/* too many attributes in key */
|
||||||
|
yyerror(INDEXTRA, (char *) 0);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
instmnt: INDEX ON NAME IS NAME =
|
||||||
|
{
|
||||||
|
/* init INDEX command */
|
||||||
|
Opflag = (int) mdINDEX;
|
||||||
|
Rsdmno = 0;
|
||||||
|
setp($3);
|
||||||
|
setp($5);
|
||||||
|
Indexname = $5;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
modify: modstmnt alias modstorage modkeys modqual
|
||||||
|
;
|
||||||
|
modstmnt: MODIFY =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdMODIFY;
|
||||||
|
Rsdmno = 0;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
modstorage: TO NAME =
|
||||||
|
{
|
||||||
|
setp($2);
|
||||||
|
}
|
||||||
|
| /* empty */ =
|
||||||
|
{
|
||||||
|
setp("same");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
modkeys: modstkey modrptkey
|
||||||
|
| /* empty */
|
||||||
|
;
|
||||||
|
modstkey: ON =
|
||||||
|
{
|
||||||
|
setp("name");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
modrptkey: modbasekey
|
||||||
|
| modrptkey COMMA modbasekey
|
||||||
|
;
|
||||||
|
modbasekey: NAME =
|
||||||
|
{
|
||||||
|
setp($1);
|
||||||
|
}
|
||||||
|
| NAME COLON NAME =
|
||||||
|
{
|
||||||
|
AAconcat($1, AAztack(":", $3), modbuf);
|
||||||
|
setp(modbuf);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
modqual: modcond modfill
|
||||||
|
| /* empty */
|
||||||
|
;
|
||||||
|
modcond: WHERE =
|
||||||
|
{
|
||||||
|
setp("\0");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
modfill: modfillnum
|
||||||
|
| modfill COMMA modfillnum
|
||||||
|
;
|
||||||
|
modfillnum: NAME IS I2CONST =
|
||||||
|
{
|
||||||
|
setp($1);
|
||||||
|
setp(AA_iocv(((I2TYPE *) $3)->i2type));
|
||||||
|
}
|
||||||
|
;
|
||||||
|
keys: alias =
|
||||||
|
{
|
||||||
|
Rsdmno++;
|
||||||
|
}
|
||||||
|
| keys COMMA alias =
|
||||||
|
{
|
||||||
|
Rsdmno++;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
print: prinstmnt keys
|
||||||
|
;
|
||||||
|
prinstmnt: PRINT =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdPRINT;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
save: savstmnt alias UNTIL date
|
||||||
|
;
|
||||||
|
savstmnt: SAVE =
|
||||||
|
{
|
||||||
|
Opflag = (int) mdSAVE;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
date: month day_year day_year
|
||||||
|
;
|
||||||
|
month: alias
|
||||||
|
| day_year
|
||||||
|
;
|
||||||
|
day_year: I2CONST =
|
||||||
|
{
|
||||||
|
p = AA_iocv(((I2TYPE *) $1)->i2type);
|
||||||
|
# ifdef xPTR3
|
||||||
|
AAtTfp(57, 1, "day_year: %s\n", p);
|
||||||
|
# endif
|
||||||
|
setp(p);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
%%
|
||||||
|
# include "../h/scanner.h"
|
||||||
|
# include "../h/bs.h"
|
||||||
|
# include "tables.y"
|
||||||
|
# include "yyerror.y"
|
||||||
Loading…
Reference in New Issue