home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / parser / xdot.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  2.0 KB  |  83 lines

  1. # include    <ingres.h>
  2. # include    <aux.h>
  3. # include    <tree.h>
  4. # include    <symbol.h>
  5. # include    "parser.h"
  6. # include    <sccs.h>
  7.  
  8. SCCSID(@(#)xdot.c    8.1    12/31/84)
  9.  
  10. extern QTREE        *tree();
  11. extern QTREE        *addresdom();
  12.  
  13. /*
  14. ** XDOT
  15. **    add to attribute stash any missing attributes in the
  16. **    source relation and then build tree with all attribs
  17. **    in the 'attid' order.  This algorithm assumes that
  18. **    the function 'attadd' insert attributes into the list
  19. **    in 'attid' order from 1 -> N.
  20. */
  21. QTREE *
  22. xdot(slot)
  23. int    slot;
  24. {
  25.     PARRNG                *rptr;
  26.     struct attribute        tuple;
  27.     register struct attribute    *ktuple;
  28.     struct attribute        ktup;
  29.     TID                tid;
  30.     TID                limtid;
  31.     QTREE        *tempt;
  32.     register QTREE    *vnode;
  33.     int                ik;
  34.     register struct atstash        *aptr;
  35.  
  36.     extern PARRNG            Parrng[];
  37.     extern char            *Trname;
  38.     extern DESC            Attdes;
  39.  
  40.     rptr = &Parrng[slot];
  41.  
  42. #    ifdef    xPTR2
  43.     tTfp(35, 0, "ALL being processed for %12s\n",
  44.         rptr->vardesc.relvname);
  45. #    endif
  46.  
  47.     if (rptr->vardesc.reldum.relatts <= 0)
  48.         syserr("xdot: rptr->vardesc.reldum.relatts %d.\n", rptr->vardesc.reldum.relatts);
  49.     /* if attstash is missing any attribs then fill in list */
  50.     if (rptr->vardesc.reldum.relatts != attcount(slot))
  51.     {
  52.         /* get all entries in attrib relation */
  53.         clearkeys(&Attdes);
  54.         ktuple = &ktup;
  55.         setkey(&Attdes, ktuple, rptr->vardesc.reldum.relid, ATTRELID);
  56.         setkey(&Attdes, ktuple, rptr->vardesc.reldum.relowner, ATTOWNER);
  57.         if (ik = find(&Attdes, EXACTKEY, &tid, &limtid, ktuple))
  58.             syserr("bad find in xdot '%d'", ik);
  59.         while (!get(&Attdes, &tid, &limtid, &tuple, 1))
  60.             if (!kcompare(&Attdes, &tuple, ktuple))
  61.                 /* add any that are not in the stash */
  62.                 if (!attfind(slot, tuple.attname))
  63.                     attadd(slot, &tuple);
  64.     }
  65.  
  66.     /* build tree for ALL */
  67.     tempt = NULL;
  68.     aptr = rptr->attlist;
  69.     while (aptr != 0)
  70.     {
  71.         vnode = tree(NULL, NULL, VAR, sizeof(struct varnode), slot, aptr);
  72.         Trname = aptr->atbname;
  73.         tempt = addresdom(tempt, vnode);
  74.         aptr = aptr->atbnext;
  75.     }
  76.  
  77. #    ifdef    xPTR3
  78.     tTfp(35, 0, "end of xdot %12s\n", rptr->vardesc.relvname);
  79. #    endif
  80.  
  81.     return(tempt);
  82. }
  83.