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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  interpr.c  -  main interpretator module of GNU SQL server
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  8.  *  This file is written by Konstantin Dyshlevoi.
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contacts: gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: interpr.c,v 1.246 1997/04/24 17:44:28 kml Exp $ */
  28. /* in values of type PSECT_PTR always : .adr=NULL <==> .off==VNULL        */
  29. /* If there is a SavePar command, it must be the first command of section */ 
  30. /* If error => RetPar ( query result returning) isn't working             */
  31. /* negative value in scan hole <==>  scan wasn't opened corrrectly        */
  32. /* zero value in field "untabid" of Tabid <==> corresponding temporary
  33.                                              table doesn't exist at this time */
  34. #include "setup_os.h"
  35. #if HAVE_TIME_H
  36. #include <time.h>
  37. #endif
  38. #include "global.h"
  39. #include "inprtyp.h"
  40. #include "gsqltrn.h"
  41. #include "sql.h"
  42. #include "expop.h"
  43. #define PRINT(x, y) /* printf (x, y) */
  44. extern DataUnit *ins_col_values;
  45. extern i4_t       numb_ins_col;
  46. extern DataUnit *data_st;
  47. extern i4_t       dt_ind, dt_max;
  48. extern i4_t       cnt_res;
  49. extern i4_t       res_hole_cnt;
  50. extern parm_t    *res_hole;
  51. struct sqlca gsqlca;
  52. #define CHECK_ERR(cd)  if (chck_err(cd)) return (cd)
  53. int
  54. proc_work (char *begin, char **Exi, MASK Handle)
  55. {      /* Command's interpretator for work with procedure from      *
  56. * address begin                                             *
  57. * Exi - address where to put returning point                *
  58. * (if Exi != NULL). Here is stored (after function`s work): *
  59. *  Returns error code : = 0 if O'k, < 0 else.               */
  60.   static char *dba_name = NULL;
  61.   char *cur = begin, *owner, **colptr;
  62.   i4_t i, reslt, error = 0, spn, typ;
  63.   i2_t *len;
  64.   enum CmdCode code;
  65.   i4_t bufsize, rngsize, Sc_num = 0, Tbl_num = 0;
  66.   char *bufptr = NULL;
  67.   char *rngptr = NULL;
  68.   MASK dop;
  69.   char tp, null_fl, retpar_done_fl = 0;
  70.   VADR       *Sc_to_close = NULL;
  71.   VADR       *Tbl_to_drop = NULL;
  72.   Scanid     *cur_scan;
  73.   UnId       *cur_tid;
  74.   DataUnit   *data_arr;
  75.   sql_type_t *col_types;
  76.   if (!dba_name)
  77.     {
  78.       char *ss=current_user_login_name;
  79.       current_user_login_name = NULL;
  80.       dba_name = get_user_name ();
  81.       current_user_login_name = ss;
  82.     }
  83.   
  84. #define SHIFT_PTR(ptr,size) {  int sz; sz = size; ALIGN(sz, SZ_LNG); ptr += sz; }
  85. #define CASE(sn,vn)    case sn: { 
  86.    struct S_##sn *vn; vn  = (struct S_##sn*)cur; 
  87.    SHIFT_PTR(cur, sizeof(struct S_##sn)); /*printf("intepretation:'%s' - begin n",#sn);*/
  88. #define ENDCASE(sn) /*printf("intepretation:'%s' - end n",#sn);*/ break; }
  89.   while (1)
  90.     {
  91.       code = *((enum CmdCode *) cur);
  92.       PRINT (" INTERPR: CODE=%dn", code);
  93.       SHIFT_PTR(cur,sizeof (enum CmdCode));
  94.       switch (code)
  95. {
  96.           /*---------------------------------------------------*/
  97.           CASE(FINDROW,FIND);
  98.           {
  99.             if ((FIND->flag) != 'y')
  100.               {
  101.                 off_adr (&(FIND->ColPtr), FIND->nr);
  102.                 FIND->Scan.adr = ADR (FIND, Scan);
  103.                 FIND->Exit.adr = ADR (FIND, Exit);
  104.                 FIND->flag = 'y';
  105.               }
  106.             SQLCODE = 0;
  107.             error = findrow (SCN (FIND), FIND->nr,
  108.                              (DataUnit **) (FIND->ColPtr.adr));
  109.             CHECK_ERR (error);
  110.             if (error == -EOSCAN)
  111.               cur = (char *) (FIND->Exit.adr);
  112.           }
  113.           ENDCASE(FINDROW);
  114.           /*---------------------------------------------------*/
  115.           CASE(READROW,RROW);
  116.           {
  117.             if (RROW->flag != 'y')
  118.               {
  119.                 off_adr (&(RROW->ColPtr), RROW->nr);
  120.                 RROW->Scan.adr = ADR (RROW, Scan);
  121.                 RROW->rlist.adr = ADR (RROW, rlist);
  122.                 RROW->flag = 'y';
  123.               }
  124.             SQLCODE = 0;
  125.             error = read_row (SCN (RROW), RROW->nr, (i4_t *) (RROW->rlist.adr),
  126.                               (DataUnit **) (RROW->ColPtr.adr));
  127.             if (error == -EOSCAN)
  128.               error = -NCR;
  129.             CHECK_ERR (error);
  130.           }
  131.           ENDCASE(READROW);
  132.           /*---------------------------------------------------*/
  133.           CASE(until,UNT);
  134.           {
  135.             if (UNT->flag != 'y')
  136.               {
  137.                 UNT->cond.adr = ADR (UNT, cond);
  138.                 UNT->ret.adr = ADR (UNT, ret);
  139.                 UNT->flag = 'y';
  140.               }
  141.             error = calculate ((TRNode *) (UNT->cond.adr),
  142.                                &reslt, 0, 0, &null_fl);
  143.             CHECK_ERR (error);
  144.             if ((null_fl != REGULAR_VALUE) || (reslt == 0))
  145.               cur = UNT->ret.adr;
  146.           }
  147.           ENDCASE(until);
  148.           /*---------------------------------------------------*/
  149.           CASE(COND_EXIT,C_EXIT);
  150.           {
  151.             if (C_EXIT->flag != 'y')
  152.               {
  153.                 C_EXIT->Tree.adr = ADR (C_EXIT, Tree);
  154.                 C_EXIT->flag = 'y';
  155.               }
  156.             error = calculate ((TRNode *) (C_EXIT->Tree.adr),
  157.                                &reslt, 0, 0, &null_fl);
  158.             CHECK_ERR (error);
  159.             if (reslt)
  160.               {
  161.                 for (i = 0; i < Sc_num; i++)
  162.                   {
  163.                     cur_scan = V_PTR(Sc_to_close[i], Scanid);
  164.                     if ( *cur_scan >= 0)
  165.                       {
  166.                         error = closescan (*cur_scan);
  167.                         *cur_scan = -EOSCAN;
  168.                         CHECK_ERR (error);
  169.                       }
  170.                   }
  171.                 for (i = 0; i < Tbl_num; i++)
  172.                   {
  173.                     cur_tid = V_PTR(Tbl_to_drop[i], UnId);
  174.                     if ((cur_tid->t).untabid)
  175.                       {
  176.                         error = dropttab (&(cur_tid->t));
  177.                         (cur_tid->t).untabid = 0;
  178.                         CHECK_ERR (error);
  179.                       }
  180.                   }
  181.                 return 0;
  182.               }
  183.           }
  184.           ENDCASE(COND_EXIT);
  185.           /*---------------------------------------------------*/
  186.           CASE(OPSCAN,SCA);
  187.           {
  188.             V_CONDBUF (bufsize, bufptr, SCA, nl, list);
  189.             V_SCN (SCA) = -EOSCAN;
  190.             spn = 0;
  191.             switch (SCA->OperType)
  192.               {
  193.               case CH_TAB:
  194.                 V_SCN (SCA) = opentscan (Tid_V_ADR (SCA, Tid), &spn,
  195.                                          SCA->mode, SCA->nr,
  196.                                          V_ADR (SCA, rlist, i4_t),
  197.                                          bufsize, bufptr, SCA->nm,
  198.                                          V_ADR (SCA, mlist, i4_t));
  199.                 break;
  200.               case CH_INDX:
  201.                 /* form condition buffer and 'break' if conditions
  202.                    aren't compatible */
  203.                 V_CONDBUF (rngsize, rngptr, SCA, ic, range);
  204.                 V_SCN (SCA) = openiscan (Iid_V_ADR (SCA, Tid), &spn,
  205.                                          SCA->mode, SCA->nr,
  206.                                          V_ADR (SCA, rlist, i4_t),
  207.                                          bufsize, bufptr, rngsize, rngptr,
  208.                                          SCA->nm, V_ADR (SCA, mlist, i4_t));
  209.                 break;
  210.               case CH_FLTR :
  211. #if 0
  212.                 V_SCN(SCA) = openfscan(Fid_V_ADR(SCA,Tid), SCA->mode,
  213.                                        SCA->nr, V_ADR(SCA,rlist,i4_t),
  214.                                        bufsize, bufptr, SCA->nm,
  215.                                        V_ADR(SCA,mlist,i4_t));
  216. #endif
  217.               default:
  218.                 CHECK_ERR (-ER_8);
  219.               }
  220.             if (bufptr)
  221.               {
  222.                 xfree (bufptr);
  223.                 bufptr = NULL;
  224.               }
  225.             if (rngptr)
  226.               {
  227.                 xfree (rngptr);
  228.                 rngptr = NULL;
  229.               }
  230.             
  231.             if (V_SCN (SCA) < 0)
  232.               CHECK_ERR (V_SCN (SCA));
  233.             if (spn > 0)
  234.               CHECK_ERR (spn);
  235.             if (V_SCN (SCA) == -EOSCAN)
  236.               cur = V_ADR (SCA, Exit, char);
  237.           }
  238.           ENDCASE(OPSCAN);
  239.           /*---------------------------------------------------*/
  240.           CASE(SetHandle,SHL);
  241.           {
  242.             if ((SHL->flag) != 'y')
  243.               {
  244.                 off_adr (&(SHL->Trees), SHL->TrCnt);
  245.                 SHL->flag = 'y';
  246.               }
  247.             dop = (SHL->Bit) ? SHL->Bit : Handle;
  248.             for (i = 0; i < SHL->TrCnt; i++)
  249.               PTR (SHL, Trees, i, TRNode)->Handle |= dop;
  250.           }
  251.           ENDCASE(SetHandle);
  252.           /*---------------------------------------------------*/
  253. case end:
  254.   if (Exi) /* CURSOR */
  255.     *Exi = cur;
  256.   else
  257.     if ((SQLCODE == 100) && (retpar_done_fl))
  258.       /* in operator SELECT the result was reached */
  259.       SQLCODE = 0;
  260.   return 0;
  261.           /*---------------------------------------------------*/
  262.           CASE(GoTo,GOTO);
  263.           {
  264.             if (GOTO->flag != 'y')
  265.               {
  266.                 GOTO->Branch.adr = ADR (GOTO, Branch);
  267.                 GOTO->flag = 'y';
  268.               }
  269.             cur = GOTO->Branch.adr;
  270.           }
  271.           ENDCASE(GoTo);
  272.           /*---------------------------------------------------*/
  273.           CASE(MODROW,MDR);
  274.           {
  275.             if (MDR->flag != 'y')
  276.               {
  277.                 off_adr (&(MDR->OutList), MDR->nl);
  278.                 MDR->Scan.adr = ADR (MDR, Scan);
  279.                 MDR->ClmTp.adr = ADR (MDR, ClmTp);
  280.                 MDR->mlist.adr = ADR (MDR, mlist);
  281.                 MDR->Constr.adr = ADR (MDR, Constr);
  282.                 MDR->flag = 'y';
  283.               }
  284.             
  285.             error = check_and_put (MDR->nl, (i4_t *) (MDR->mlist.adr),
  286.                                    (TRNode **) (MDR->OutList.adr), &data_arr,
  287.                                    (S_ConstrHeader *) (MDR->Constr.adr));
  288.             CHECK_ERR (error);
  289.             
  290.             error = mod_data (SCN (MDR), MDR->nl, data_arr, (sql_type_t *) (MDR->ClmTp.adr),
  291.                               NULL, (i4_t *) (MDR->mlist.adr));
  292.             CHECK_ERR (error);
  293.           }
  294.           ENDCASE(MODROW);
  295.           /*---------------------------------------------------*/
  296.           CASE(INSROW,INS);
  297.           {
  298.             if (INS->flag != 'y')
  299.               {
  300.                 off_adr (&(INS->InsList), INS->nv);
  301.                 INS->Tid.adr = ADR (INS, Tid);
  302.                 INS->ClmTp.adr = ADR (INS, ClmTp);
  303.                 INS->Constr.adr = ADR (INS, Constr);
  304.                 INS->flag = 'y';
  305.               }
  306.             
  307.             error = check_and_put (INS->nv, NULL, (TRNode **) (INS->InsList.adr),
  308.                                    &data_arr, (S_ConstrHeader *) (INS->Constr.adr));
  309.             CHECK_ERR (error);
  310.             
  311.             error = ins_data (Tid_ADR (INS), INS->nv, data_arr,
  312.                               (sql_type_t *) (INS->ClmTp.adr), NULL);
  313.             CHECK_ERR (error);
  314.           }
  315.           ENDCASE(INSROW);
  316.           /*---------------------------------------------------*/
  317.           CASE(INSLIST,INL);
  318.           {
  319.             if (INL->flag != 'y')
  320.               {
  321.                 off_adr (&(INL->col_ptr), INL->nv);
  322.                 INL->Tid.adr = ADR (INL, Tid);
  323.                 INL->credat_adr.adr = ADR (INL, credat_adr);
  324.                 INL->cretime_adr.adr = ADR (INL, cretime_adr);
  325.                 INL->col_types.adr = ADR (INL, col_types);
  326.                 INL->len.adr = ADR (INL, len);
  327.                 INL->flag = 'y';
  328.                 CHECK_ERR (error);
  329.               }
  330.             
  331.             if (INL->credat_adr.adr)
  332.               curdate (INL->credat_adr.adr);
  333.             if (INL->cretime_adr.adr)
  334.               curtime (INL->cretime_adr.adr);
  335.             
  336.             CHECK_ARR_SIZE (ins_col_values, numb_ins_col, INL->nv, DataUnit);
  337.             bzero (ins_col_values, INL->nv * sizeof (DataUnit));
  338.             colptr = (char **) (INL->col_ptr.adr);
  339.             col_types = (sql_type_t *) (INL->col_types.adr);
  340.             len = (i2_t *) (INL->len.adr);
  341.             for (i = 0; i < INL->nv; i++)
  342.               {
  343.                 ins_col_values[i].type = col_types[i];
  344.                 error = mem_to_DU ((colptr[i]) ? REGULAR_VALUE : NULL_VALUE,
  345.                                    col_types[i].code, (len) ? len[i] : -1,
  346.                                    colptr[i], ins_col_values + i);
  347.                 CHECK_ERR (error);
  348.               }
  349.             
  350.             error = handle_statistic (Tid_ADR (INL)->untabid,
  351.                                       INL->nv, INL->nv, NULL, TRUE);
  352.             CHECK_ERR (error);
  353.             
  354.             error = ins_data (Tid_ADR (INL), INL->nv, ins_col_values, col_types, NULL);
  355.             CHECK_ERR (error);
  356.           }
  357.           ENDCASE(INSLIST);
  358.           /*---------------------------------------------------*/
  359.           CASE(INSTAB,INST);
  360.           {
  361.             error = instttab (V_ADR (INST, TidFrom, Tabid), V_ADR (INST, TidTo, Tabid),
  362.                               0, NULL, 0, NULL, NULL);
  363.             CHECK_ERR (error);
  364.           }
  365.           ENDCASE(INSTAB);
  366.           /*---------------------------------------------------*/
  367.           CASE(DELROW,DROW);
  368.           {
  369.             error = check_and_put (0, NULL, NULL, NULL,
  370.                                    V_ADR (DROW, Constr, S_ConstrHeader));
  371.             CHECK_ERR (error);
  372.             
  373.             error = delrow (V_SCN (DROW), NULL);
  374.             CHECK_ERR (error);
  375.           }
  376.           ENDCASE(DELROW);
  377.           /*---------------------------------------------------*/
  378.           CASE(TMPSCN,REL);
  379.           {
  380.             V_CONDBUF (bufsize, bufptr, REL, nl, list);
  381.             
  382.             switch(REL->OperType)
  383.               {
  384.               case 't': /* build table */
  385.                 error = bldtttab (Tid_V_ADR (REL, TidFrom),
  386.                                   Tid_V_ADR (REL, TidTo), REL->nr,
  387.                                   V_ADR (REL, rlist, i4_t),
  388.                                   bufsize, bufptr, NULL);
  389.                 break;
  390.               case 'i': /* build index */
  391.                 V_CONDBUF (rngsize, rngptr, REL, ic, range);
  392.                 error = bldtitab (Iid_V_ADR (REL, TidFrom),
  393.                                   Tid_V_ADR (REL, TidTo), REL->nr,
  394.                                   V_ADR (REL, rlist, i4_t), bufsize, bufptr,
  395.                                   rngsize, rngptr, NULL);
  396.                 break;
  397.               case 'f' : /* build filter */
  398. #if 0
  399.                 error = bldtftab(Fid_V_ADR(REL,TidFrom),
  400.                                  Tid_V_ADR(REL,TidTo),REL->nr,
  401.                                  V_ADR(REL,rlist,i4_t),
  402.                                  bufsize,bufptr,NULL);
  403. #endif
  404.               default:
  405.                 CHECK_ERR (-ER_8);
  406.               }
  407.             if (bufptr)
  408.               {
  409.                 xfree (bufptr);
  410.                 bufptr = NULL;
  411.               }
  412.             if (rngptr)
  413.               {
  414.                 xfree (rngptr);
  415.                 rngptr = NULL;
  416.               }
  417.             
  418.             CHECK_ERR (error);
  419.             
  420.           }
  421.           ENDCASE(TMPSCN);
  422.           /*---------------------------------------------------*/
  423.           CASE(SORTTBL,SOR);
  424.           {
  425.             error = sorttab (Tid_V_ADR (SOR, TidIn), Tid_V_ADR (SOR, TidOut),
  426.                              SOR->ns, V_ADR (SOR, rlist, i4_t), SOR->order, SOR->fl);
  427.             CHECK_ERR (error);
  428.           }
  429.           ENDCASE(SORTTBL);
  430.           /*---------------------------------------------------*/
  431.           CASE(MKUNION,UNI);
  432.           {
  433.             error = uidnsttab (Tid_V_ADR (UNI, TidIn1), Tid_V_ADR (UNI, TidIn2),
  434.                                Tid_V_ADR (UNI, TidOut), BLDUN);
  435.             CHECK_ERR (error);
  436.           }
  437.           ENDCASE(MKUNION);
  438.           /*---------------------------------------------------*/
  439.           CASE(RetPar,PRET);
  440.           {
  441.             if (PRET->flag != 'y')
  442.               {
  443.                 off_adr (&(PRET->OutList), PRET->OutNum);
  444.                 PRET->flag = 'y';
  445.               }
  446.             
  447.             /* PRET->ExitFlag == FALSE => operator SELECT */
  448.             if (!PRET->ExitFlag)
  449.               if (!retpar_done_fl)
  450.                 retpar_done_fl++;
  451.               else  /* one row was already extracted */
  452.                 CHECK_ERR (-ER_SEL);
  453.             
  454.             cnt_res = PRET->OutNum;
  455.             if (res_hole_cnt < cnt_res)
  456.               {
  457.                 i4_t need_sz = cnt_res * sizeof (parm_t);
  458.                 if (res_hole)
  459.                   {
  460.                     res_hole = (parm_t*) xrealloc (res_hole, need_sz);
  461.                     bzero (res_hole, need_sz);
  462.                   }
  463.                 else
  464.                   res_hole = (parm_t*) xmalloc (need_sz);
  465.                 res_hole_cnt = cnt_res;
  466.               }
  467.     
  468.             for (i = 0; i < cnt_res; i++)
  469.               {
  470.                 typ = TYP (PRET, OutList, i).code;
  471.                 error = calculate (PTR (PRET, OutList, i, TRNode), NULL, 0, 0, NULL);
  472.                 CHECK_ERR (error);
  473.                 
  474.                 error = DU_to_rpc (PtrDtNextEl, res_hole + i, typ);
  475.                 CHECK_ERR (error);
  476.               } /* for */
  477.             
  478.             if (PRET->ExitFlag) /* CURSOR */
  479.               {
  480.                 if (Exi)
  481.                   *Exi = cur;
  482.                 return 0;
  483.               }
  484.           }
  485.           ENDCASE(RetPar);
  486.           /*---------------------------------------------------*/
  487.           CASE(TMPCRE,RNEW);
  488.           {
  489.             error = crettab (Tid_V_ADR (RNEW, Tid), RNEW->colnum,
  490.                              RNEW->nnulnum, V_ADR (RNEW, coldescr, sql_type_t));
  491.             CHECK_ERR (error);
  492.           }
  493.           ENDCASE(TMPCRE);
  494.           /*---------------------------------------------------*/
  495.           CASE(MKGROUP,GRP);
  496.           {
  497.             error = make_group (Tid_V_ADR (GRP, TidIn),
  498.                                 Tid_V_ADR (GRP, TidOut), GRP->ng,
  499.                                 V_ADR (GRP, glist, i4_t), GRP->order,
  500.                                 GRP->nf, V_ADR (GRP, flist, i4_t),
  501.                                 V_ADR (GRP, fl, char));
  502.             CHECK_ERR (error);
  503.           }
  504.           ENDCASE(TMPCRE);
  505.           /*---------------------------------------------------*/
  506.           CASE(FUNC,FUN);
  507.           {
  508.             if ((FUN->flag) != 'y')
  509.               {
  510.                 off_adr (&(FUN->colval), FUN->nf);
  511.                 FUN->Tid.adr = ADR (FUN, Tid);
  512.                 FUN->list.adr = ADR (FUN, list);
  513.                 FUN->range.adr = ADR (FUN, range);
  514.                 FUN->flist.adr = ADR (FUN, flist);
  515.                 FUN->fl.adr = ADR (FUN, fl);
  516.                 FUN->Exit.adr = ADR (FUN, Exit);
  517.                 FUN->flag = 'y';
  518.               }
  519.             CONDBUF (bufsize, bufptr, FUN, nl, list);
  520.     
  521.             SQLCODE = 0;
  522.             if (FUN->OperType == CH_INDX)
  523.               {
  524.                 CONDBUF (rngsize, rngptr, FUN, ic, range);
  525.                 
  526.                 error = funci (Iid_ADR (FUN), NULL, bufsize, bufptr, rngsize,
  527.                                rngptr, (DataUnit **)(FUN->colval.adr), FUN->nf,
  528.                                (i4_t *)(FUN->flist.adr), (char *)(FUN->fl.adr));
  529.               }
  530.             else
  531.               {
  532.                 if (FUN->OperType != CH_TAB)
  533.                   CHECK_ERR (-ER_8);
  534.                 error = func (Tid_ADR (FUN), NULL, bufsize, bufptr,
  535.                               (DataUnit **)(FUN->colval.adr), FUN->nf,
  536.                               (i4_t *)(FUN->flist.adr), (char *)(FUN->fl.adr));
  537.               }
  538.             
  539.             if (bufptr)
  540.               {
  541.                 xfree (bufptr);
  542.                 bufptr = NULL;
  543.               }
  544.             if (rngptr)
  545.               {
  546.                 xfree (rngptr);
  547.                 rngptr = NULL;
  548.               }
  549.             
  550.             CHECK_ERR (error);
  551.           }
  552.           ENDCASE(FUNC);
  553.           /*---------------------------------------------------*/
  554.           CASE(CLOSE,CLS);
  555.           {
  556.             error = closescan (V_SCN (CLS));
  557.             V_SCN (CLS) = -EOSCAN;
  558.             CHECK_ERR (error);
  559.           }
  560.           ENDCASE(CLOSE);
  561.           /*---------------------------------------------------*/
  562.           CASE(DROPTTAB,DRT );
  563.           {
  564.             error = dropttab (Tid_V_ADR (DRT, Tid));
  565.             Tid_V_ADR (DRT, Tid) -> untabid = 0;
  566.             CHECK_ERR (error);
  567.   }
  568.           ENDCASE(DROPTTAB);
  569.           /*---------------------------------------------------*/
  570.           CASE(DROPBASE,DRB );
  571.           {
  572.             error = drop_table (DRB->untabid);
  573.             CHECK_ERR (error);
  574.   }
  575.           ENDCASE(DROPBASE);
  576.           /*---------------------------------------------------*/
  577.           CASE(ERROR,ERR );
  578.           {
  579.             if (Exi)
  580.               *Exi = cur - sizeof (enum CmdCode);
  581.             CHECK_ERR (ERR->Err);
  582.             return 0;
  583.   }
  584.           ENDCASE(ERROR);
  585.           /*---------------------------------------------------*/
  586.           CASE(Procedure,PRC );
  587.           {
  588.             error = proc_work (V_ADR (PRC, ProcBeg, char), NULL, 0);
  589.             CHECK_ERR (error);
  590.   }
  591.           ENDCASE(Procedure);
  592.           /*---------------------------------------------------*/
  593.           CASE(CRETAB,CTB );
  594.           {
  595.             owner = V_ADR (CTB, owner, char);
  596.             if (strcmp (owner, current_user_login_name) &&
  597.                 strcmp (current_user_login_name, dba_name))
  598.               CHECK_ERR (-ER_PRIVLG);
  599.             if (existtb (owner, V_ADR (CTB, tabname, char), NULL, &tp))
  600.               CHECK_ERR (-ER_CRETAB);
  601.             error = creptab (V_ADR (CTB, tabid, Tabid), CTB->segid,
  602.                              NULL, CTB->colnum, CTB->nncolnum,
  603.                              V_ADR (CTB, coldescr, sql_type_t));
  604.             if (error < 0)
  605.               error = -ER_CRETAB;
  606.             CHECK_ERR (error);
  607.   }
  608.           ENDCASE(CRETAB);
  609.           /*---------------------------------------------------*/
  610.           CASE(CREIND,CIND );
  611.           {
  612.             error = creind (V_ADR (CIND, indid, Indid), V_ADR (CIND, tabid, Tabid), NULL,
  613.                             CIND->uniq_fl, 0, CIND->colnum, V_ADR (CIND, clmlist, i4_t));
  614.             if (error < 0)
  615.               error = -ER_CREIND;
  616.             CHECK_ERR (error);
  617.   }
  618.           ENDCASE(CREIND);
  619.           /*---------------------------------------------------*/
  620.           CASE(PRIVLG,PRIV );
  621.           {
  622.             if (strcmp(current_user_login_name, dba_name) &&
  623.                 ( strcmp(V_ADR (PRIV, user, char), current_user_login_name) ||
  624.                   ((!(PRIV->owner) ||
  625.                     strcmp(V_ADR (PRIV, owner, char), current_user_login_name)) &&
  626.                    tabpvlg (*V_ADR (PRIV, untabid, i4_t),
  627.                             V_ADR (PRIV, user, char), V_ADR (PRIV, privcodes, char),
  628.                             PRIV->un, (PRIV->un) ? V_ADR (PRIV, ulist, i4_t) : NULL,
  629.                             PRIV->rn, (PRIV->rn) ? V_ADR (PRIV, rlist, i4_t) : NULL)) ))
  630.               CHECK_ERR (-ER_PRIVLG);
  631.   }
  632.           ENDCASE(PRIVLG);
  633.           /*---------------------------------------------------*/   
  634.           CASE(Drop_Reg,DREG );
  635.           {
  636.             Sc_num = DREG->ScanNum;
  637.             if (Sc_num)
  638.               Sc_to_close = V_ADR (DREG, Scan, VADR);
  639.             
  640.             Tbl_num = DREG->TabdNum;
  641.             if (Tbl_num)
  642.               Tbl_to_drop = V_ADR (DREG, Tabd, VADR);
  643.   }
  644.           ENDCASE(Drop_Reg);
  645.           /*---------------------------------------------------*/   
  646. default:
  647.   CHECK_ERR (-ER_8);
  648. } /* switch    */
  649.     }   /* while     */
  650. }   /* proc_work */