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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  repack.c - routines for getting data out from syntax  tree
  3.  *             and packing it to structures used in executable
  4.  *             format of GNU SQL server interpretator
  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 Andrew Yahin
  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: repack.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  30. #include "global.h"
  31. #include "tassert.h"
  32. #include "syndef.h"
  33. #include "cycler.h"
  34. #define FUNC_WITH_DIST(code_d,code_a) 
  35.   return ((TstF_TRN(func,DISTINCT_F))? code_d : code_a )
  36. static char
  37. code_func (TXTREF func)
  38. {
  39.   enum token code = CODE_TRN (func);
  40.   switch (code)
  41.     {
  42.     case COUNT:
  43.       FUNC_WITH_DIST (FN_DT_COUNT, FN_COUNT);
  44.     case AVG:
  45.       FUNC_WITH_DIST (FN_DT_AVG, FN_AVG);
  46.     case SUM:
  47.       FUNC_WITH_DIST (FN_DT_SUMM, FN_SUMM);
  48.     case MAX:
  49.       return FN_MAX;
  50.     case MIN:
  51.       return FN_MIN;
  52.     default:
  53.       TASSERT (Is_Function (func), func);
  54.     }
  55.   return (char) 0;
  56. }
  57. #undef FUNC_WITH_DIST
  58. #define COL_NUMB(node) ((node!=TNULL) ? XLNG_TRN(node,0) : 0)
  59. void
  60. prepare_MG (TXTREF ptr, i4_t *g_clm_nmb, VADR * g_clm_arr,
  61.     i4_t *func_nmb, VADR * func_arr, VADR * func_clm_arr)
  62. {
  63. /*
  64.  *  g_clm_nmb      the address of quantity of group rows.
  65.  * *g_clm_arr      the address of array of group row numbers.
  66.  *  func_nmb     - the quantity of functions
  67.  * *func_arr     - the array of functions' codes
  68.  * *func_clm_arr - the address of row numbers where rows are functions'
  69.  *                 arguments
  70.  */
  71.   TXTREF vec = XVEC_TRN (ptr, 0), cur_pos = VOP (vec, 0).txtp;
  72.   i4_t i, j, len = VLEN (vec);
  73.   i4_t *g_clm_arr_n, *func_clm_arr_n;
  74.   char *func_arr_n;
  75.   
  76.   i=0;
  77.   while(i<len)
  78.     {
  79.       cur_pos = VOP (vec, i++).txtp;
  80.       if(CODE_TRN (cur_pos) != COL){ i--;break;}
  81.     }
  82.   *g_clm_arr    = VMALLOC (i, i4_t);
  83.   *func_arr     = VMALLOC (len - i, char);
  84.   *func_clm_arr = VMALLOC (len - i, i4_t);
  85.   g_clm_arr_n    = V_PTR (*g_clm_arr, i4_t);
  86.   func_arr_n     = V_PTR (*func_arr, char);
  87.   func_clm_arr_n = V_PTR (*func_clm_arr, i4_t); 
  88.     
  89.   *g_clm_nmb = i;
  90.   *func_nmb = len - i;
  91.   for (j = 0;
  92.        j < i;
  93.        g_clm_arr_n[j] = COL_NUMB (VOP (vec, j).txtp),
  94.        j++);
  95.   for (j = i; j < len; j++)
  96.     {
  97.       func_arr_n[j - i] = code_func (VOP (vec, j).txtp);
  98.       func_clm_arr_n[j - i] = COL_NUMB (DOWN_TRN (VOP (vec, j).txtp));
  99.     }
  100. }
  101. void
  102. prepare_SRT (TXTREF ptr, i4_t *clm_nmb, VADR * clm_arr)
  103. {
  104. /*
  105.  * clm_nmb - number of sorted columns
  106.  * clm_arr - array of columns to sort
  107.  */
  108.   i4_t *arr;
  109.   i4_t i;
  110.   VADR V_arr;
  111.   TXTREF vec = XVEC_TRN (ptr, 0);
  112.   *clm_nmb = VLEN (vec);
  113.   P_VMALLOC (arr, *clm_nmb, i4_t);
  114.   for (i = 0; i < *clm_nmb; i++)
  115.     arr[i] = VOP (vec, i).l;
  116.   *clm_arr = V_arr;
  117. }
  118. /* returns number of updated columns */
  119. int
  120. prepare_CURS (TXTREF ptr, VADR * curs_arr)
  121. {
  122. /*
  123.  ptr      - tree node
  124.  curs_arr - array of numbers of updated columns
  125. */
  126.   i4_t num_of_updted = 0, new_col;
  127.   i4_t i, j, count, n, n_max;
  128.   TXTREF upd;
  129.   i4_t *vect, *arr;
  130.   VADR V_arr;
  131.   TASSERT (CODE_TRN (ptr) == DECL_CURS, ptr);
  132.   for (upd = RIGHT_TRN (ptr); upd; upd = RIGHT_TRN (upd))
  133.     if (CODE_TRN (upd) == UPDATE)
  134.       num_of_updted += VLEN (XVEC_TRN (upd, 5));
  135.   n_max = num_of_updted;
  136.   vect = (i4_t *) xmalloc (sizeof (i4_t) * num_of_updted);
  137.   num_of_updted = 0;
  138.   for (upd = RIGHT_TRN (ptr); upd; upd = RIGHT_TRN (upd))
  139.     if (CODE_TRN (upd) == UPDATE)
  140.       for (j = 0, new_col = 1; j < VLEN (XVEC_TRN (upd, 5)); new_col = 1, j++)
  141. {
  142.   for (i = 0; i < num_of_updted; i++)
  143.     if (vect[i] == VOP (XVEC_TRN (upd, 5), j).l)
  144.       new_col = 0;
  145.   if (new_col)
  146.     vect[num_of_updted++] = VOP (XVEC_TRN (upd, 5), j).l;
  147. }
  148.   n = num_of_updted;
  149.   P_VMALLOC (arr, n, i4_t);
  150.   count = 0;
  151.   for (j = 0, new_col = 1; j < n_max; new_col = 1, j++)
  152.     {
  153.       for (i = 0; i < count; i++)
  154. if (vect[j] == arr[i])
  155.   new_col = 0;
  156.       if (new_col)
  157. arr[count++] = vect[j];
  158.     }
  159.   *curs_arr = V_arr;
  160.   xfree (vect);
  161.   return n;
  162. }
  163. void
  164. prepare_UPD (TXTREF ptr, i4_t *clm_nmb, VADR * clm_arr)
  165. {
  166. /*
  167.  * number of modified cloumns and array of their indexes
  168.  * clm_nmb - number of sorted columns
  169.  * clm_arr - array of columns to sort
  170.  */
  171.   i4_t *arr;
  172.   i4_t i;
  173.   VADR V_arr;
  174.   TXTREF vec = UPD_CLMNS (ptr);
  175.   *clm_nmb = VLEN (vec);
  176.   P_VMALLOC (arr, *clm_nmb, i4_t);
  177.   for (i = 0; i < *clm_nmb; i++)
  178.     arr[i] = VOP (vec, i).l;
  179.   *clm_arr = V_arr;
  180. }