aggrsfn.c
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:7k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * aggrsfn.c  - calculation of aggregate functions
  3.  *               on specific temporary table
  4.  *              Kernel of GNU SQL-server  
  5.  *
  6.  * This file is a part of GNU SQL Server
  7.  *
  8.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  9.  *  Developed at the Institute of System Programming
  10.  *  This file is written by  Vera Ponomarenko
  11.  *
  12.  *  This program is free software; you can redistribute it and/or modify
  13.  *  it under the terms of the GNU General Public License as published by
  14.  *  the Free Software Foundation; either version 2 of the License, or
  15.  *  (at your option) any later version.
  16.  *
  17.  *  This program is distributed in the hope that it will be useful,
  18.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  *  GNU General Public License for more details.
  21.  *
  22.  *  You should have received a copy of the GNU General Public License
  23.  *  along with this program; if not, write to the Free Software
  24.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  25.  *
  26.  *  Contacts:   gss@ispras.ru
  27.  *
  28.  */
  29. /* $Id: aggrsfn.c,v 1.248 1997/04/21 12:38:34 vera Exp $ */
  30. #include "xmem.h"
  31. #include "destrn.h"
  32. #include "strml.h"
  33. #include "fdcltrn.h"
  34. #include "cmpdecl.h"
  35. extern struct des_nseg desnseg;
  36. static u2_t
  37. fsvfrm (char *buf, char *val, struct des_trel *destrel)
  38. {
  39.   char *sc;
  40.   u2_t type, k, k1, fn, n;
  41.   struct des_field *df;
  42.   df = (struct des_field *) (destrel + 1);
  43.   fn = *(u2_t *) ((char *) destrel + destrel->fieldn * rfsize);
  44.   type = (df + fn)->field_type;
  45.   sc = val + 1;
  46.   val += scscal (val);
  47.   for (k = 0, k1 = 0; k < fn; k1 = 0, sc++)
  48.     for (; k1 < 7 && k < fn; k++, k1++)
  49.       if ((*sc & BITVL(k1)) != 0)
  50. val = proval (val, type);
  51.   n = get_length (val, type);
  52.   bcopy (val, buf, n);
  53.   return (n);
  54. }
  55. u2_t
  56. minstab (struct id_rel *pidrel, char *val)
  57. {
  58.   u2_t *ai, sz, ntob;
  59.   struct des_trel *destrel;
  60.   char *asp;
  61.   struct A pg;
  62.   if (pidrel->urn.segnum != NRSNUM)
  63.     return (NIOB);
  64.   ntob = pidrel->urn.obnum;
  65.   if (ntob > desnseg.mtobnum)
  66.     return (NIOB);
  67.   destrel = (struct des_trel *) * (desnseg.tobtab + ntob);
  68.   if (destrel == NULL)
  69.     return (NIOB);
  70.   if (((struct prtob *) destrel)->prob != TREL)
  71.     return (NIOB);
  72.   if (((struct prtob *) destrel)->prsort != SORT)
  73.     return (N_SORT);
  74.   if (((struct prtob *) destrel)->prdrctn == GROW)
  75.     {
  76.       asp = getwl (&pg, NRSNUM, destrel->tobtr.firstpn);
  77.       for (ai = (u2_t *) (asp + phtrsize); *ai != 0; ai++);
  78.     }
  79.   else
  80.     {
  81.       asp = getwl (&pg, NRSNUM, destrel->tobtr.lastpn);
  82.       ai = (u2_t *) (asp + phtrsize) + ((struct p_h_tr *) asp)->linptr;
  83.     }
  84.   sz = fsvfrm (val, asp + *ai, destrel);
  85.   putwul (&pg, 'n');
  86.   return (sz);
  87. }
  88. u2_t
  89. maxstab (struct id_rel * pidrel, char *val)
  90. {
  91.   u2_t *ai, sz, ntob;
  92.   struct des_trel *destrel;
  93.   char *asp;
  94.   struct A pg;
  95.   if (pidrel->urn.segnum != NRSNUM)
  96.     return (NIOB);
  97.   ntob = pidrel->urn.obnum;
  98.   if (ntob > desnseg.mtobnum)
  99.     return (NIOB);
  100.   destrel = (struct des_trel *) * (desnseg.tobtab + ntob);
  101.   if (((struct prtob *) destrel)->prob != TREL)
  102.     return (NIOB);
  103.   if (((struct prtob *) destrel)->prsort != SORT)
  104.     return (N_SORT);
  105.   if (((struct prtob *) destrel)->prdrctn == GROW)
  106.     {
  107.       asp = getwl (&pg, NRSNUM, destrel->tobtr.lastpn);
  108.       ai = (u2_t *) (asp + phtrsize) + ((struct p_h_tr *) asp)->linptr;
  109.     }
  110.   else
  111.     {
  112.       asp = getwl (&pg, NRSNUM, destrel->tobtr.firstpn);
  113.       for (ai = (u2_t *) (asp + phtrsize); *ai != 0; ai++);
  114.     }
  115.   sz = fsvfrm (val, asp + *ai, destrel);
  116.   putwul (&pg, 'n');
  117.   return (sz);
  118. }
  119. void
  120. agrfrel (struct ans_next *ans, struct id_rel *pidrel, u2_t nf,
  121.          u2_t * mnf, u2_t slsz, char *sc, char *flaglist)
  122. {
  123.   u2_t fn, fdf, sn, *ai, *ali, pn;
  124.   struct des_field *df;
  125.   i4_t i = 0;
  126.   char **agrl, *asp = NULL;
  127.   i2_t n;
  128.   struct A pg;
  129.   char *arrpnt[BD_PAGESIZE];
  130.   u2_t arrsz[BD_PAGESIZE];
  131.   sn = pidrel->urn.segnum;
  132.   if (sn == NRSNUM)
  133.     {
  134.       struct des_trel *destrel;
  135.       
  136.       n = pidrel->urn.obnum;
  137.       if (n > desnseg.mtobnum)
  138. {
  139.   ans->cotnxt = NIOB;
  140.   return;
  141. }
  142.       destrel = (struct des_trel *) * (desnseg.tobtab + n);
  143.       if (destrel == NULL)
  144. {
  145.   ans->cotnxt = NIOB;
  146.   return;
  147. }
  148.       if (((struct prtob *) destrel)->prob != TREL)
  149. {
  150.   ans->cotnxt = NIOB;
  151.   return;
  152. }
  153.       fn = destrel->fieldn;
  154.       fdf = destrel->fdftr;
  155.       df = (struct des_field *) (destrel + 1);
  156.       if ((ans->cotnxt = testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL)) != OK)
  157. return;
  158.       agrl = (char **) xmalloc (nf * sizeof (char *));
  159.       agrl_frm (agrl, df, nf, mnf, flaglist);      
  160.       pn = destrel->tobtr.firstpn;
  161.       if (pn != (u2_t) ~ 0)
  162.         i = 1;
  163.       for ( ; pn != (u2_t) ~ 0; )
  164. {
  165.   asp = getwl (&pg, NRSNUM, pn);
  166.   ai = (u2_t *) (asp + phtrsize);
  167.   ali = ai + ((struct p_h_tr *) asp)->linptr;
  168.           for (; ai <= ali; ai++)
  169.             if (*ai != 0 &&
  170.                 tstcsel (df, fn, fdf, slsz,
  171.                          sc, asp + *ai, arrpnt, arrsz) != 0)
  172.               agrcount (agrl, asp + *ai, df, fdf, fn, nf, mnf, flaglist);
  173.           pn = ((struct listtob *) asp)->nextpn;
  174.           putwul (&pg, 'n');
  175. }
  176.     }
  177.   else
  178.     {
  179.       struct d_sc_i *scind;
  180.       struct d_r_t *desrel;
  181.       struct ldesscan *disc;
  182.       u2_t size;
  183.       i4_t rep;
  184.       
  185.       if ((ans->cotnxt = contir (pidrel, &desrel)) != OK)
  186. return;
  187.       fn = desrel->desrbd.fieldnum;
  188.       fdf = desrel->desrbd.fdfnum;
  189.       df = (struct des_field *) (desrel + 1);
  190.       if ((ans->cotnxt = testcond (df, fn, fdf, 0, NULL, &slsz, sc, 0, NULL)) != OK)
  191. return;
  192.       if ((ans->cotnxt = synlsc (RSC, pidrel, sc, slsz, fn, NULL)) != OK)
  193. return;
  194.       scind = rel_scan (sn, pidrel->urn.obnum, (char *) desrel,
  195.                         &n, 0, NULL, sc, slsz, 0, NULL);
  196.       agrl = (char **) xmalloc (nf * sizeof (char *));
  197.       agrl_frm (agrl, df, nf, mnf, flaglist);      
  198.       disc = &scind->dessc;
  199.       rep = fgetnext (disc, &pn, &size, FASTSCAN);
  200.       if (rep != EOI)
  201.         i = 1;      
  202.       while (rep != EOI)
  203. {
  204.           while ((asp = getpg (&pg, sn, pn, 's')) == NULL);
  205.           ai = (u2_t *) (asp + phsize);
  206.           ali = ai + ((struct page_head *) asp)->lastin;
  207.           for (; ai <= ali; ai++)
  208.             if (*ai != 0 && CHECK_PG_ENTRY(ai) &&
  209.                 fndslc (desrel, asp, ai, sc, slsz, NULL) != 0)
  210.               agrcount (agrl, asp + *ai, df, fdf, fn, nf, mnf, flaglist);
  211.           putpg (&pg, 'n');
  212.           rep = getnext (disc, &pn, &size, FASTSCAN);
  213.         }
  214.       if (i == 1)
  215.         xfree (disc->cur_key);
  216.       delscan (n);      
  217.     }
  218.   if (i == 1)
  219.     distagr_frm (agrl, nf, flaglist);
  220.   ans->csznxt = write_val (ans->cadnxt, agrl, df, nf, mnf, flaglist);
  221.   for (i = 0; i < nf; i++)
  222.     xfree (agrl[i]);
  223.   xfree ((char *) agrl);
  224.   return;
  225. }