Annotation of 42BSD/ingres/source/parser/format.c, revision 1.1.1.1

1.1       root        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(@(#)format.c    7.1     2/5/81)
                      9: 
                     10: /*
                     11: **  FORMAT
                     12: **     routine to compute the format of the result relation attributes
                     13: **     it is called after ATTLOOKUP so the tuple defining the current
                     14: **     attribute is already available.
                     15: **     if the element is a function of more than one attribute, the result
                     16: **     domain format is computed by the following rules:
                     17: **             - no fcns allowed on character attributes
                     18: **             - fcn of integer attribs is an integer fcn with
                     19: **               length = MAX(length of all attributes)
                     20: **             - fcn of floating point attribs is a floating point
                     21: **               fcn with length = MIN(length of all attribs)
                     22: **             - fcn of integer and floating attributes is a
                     23: **               floating fcn with length = MIN(length of all floating
                     24: **               attributes)
                     25: **
                     26: **     Trace Flags:
                     27: **             Format ~~ 52.0, 52.1
                     28: */
                     29: 
                     30: format(result1)
                     31: QTREE  *result1;
                     32: {
                     33:        register char           rfrmt;
                     34:        register char           rfrml;
                     35:        register QTREE          *result;
                     36:        struct constop          *cpt;
                     37: 
                     38:        extern struct out_arg   Out_arg;
                     39:        extern struct constop   Coptab[];
                     40:        extern char             Trfrml;
                     41:        extern char             Trfrmt;
                     42:        extern int              Qlflag;
                     43: 
                     44: # ifdef        xPTR2
                     45:        tTfp(52, 0, "format:.\n");
                     46: # endif
                     47: 
                     48:        result = result1;
                     49:        switch (result->sym.type)
                     50:        {
                     51:          case VAR:
                     52:                rfrmt = result->sym.value.sym_var.varfrmt;
                     53:                rfrml = result->sym.value.sym_var.varfrml;
                     54:                break;
                     55: 
                     56:          case AOP:
                     57:                switch (result->sym.value.sym_op.opno)
                     58:                {
                     59:                  case opAVG:
                     60:                  case opAVGU:
                     61:                        rfrmt = FLOAT;
                     62:                        rfrml = 8;
                     63:                        if (result->sym.value.sym_op.agfrmt == CHAR)
                     64:                                /* character domain not allowed in these aggs */
                     65:                                par_error(AVGTYPE, WARN, 0);
                     66:                        break;
                     67: 
                     68:                  case opCOUNT:
                     69:                  case opCOUNTU:
                     70:                        rfrmt = INT;
                     71:                        rfrml = 4;
                     72:                        break;
                     73: 
                     74:                  case opANY:
                     75:                        rfrmt = INT;
                     76:                        rfrml = 2;
                     77:                        break;
                     78: 
                     79:                  case opSUM:
                     80:                  case opSUMU:
                     81:                        rfrmt = result->sym.value.sym_op.agfrmt;
                     82:                        rfrml = result->sym.value.sym_op.agfrml;
                     83:                        if (rfrmt == CHAR)
                     84:                                /* no char domains for these aggs */
                     85:                                par_error(SUMTYPE, WARN, 0);
                     86:                        break;
                     87: 
                     88:                  default:
                     89:                        rfrmt = result->sym.value.sym_op.agfrmt;
                     90:                        rfrml = result->sym.value.sym_op.agfrml;
                     91:                        break;
                     92:                }
                     93:                break;
                     94: 
                     95:          case AGHEAD:
                     96:                /*
                     97:                ** can get format info from the AOP node because
                     98:                ** it already has format info computed
                     99:                */
                    100:                if (result->left->sym.type == AOP)
                    101:                {
                    102:                        /* no by-list */
                    103:                        rfrmt = result->left->sym.value.sym_op.opfrmt;
                    104:                        rfrml = result->left->sym.value.sym_op.opfrml;
                    105:                }
                    106:                else
                    107:                {
                    108:                        /* skip over by-list */
                    109:                        rfrmt = result->left->right->sym.value.sym_resdom.resfrmt;
                    110:                        rfrml = result->left->right->sym.value.sym_resdom.resfrml;
                    111:                }
                    112:                break;
                    113: 
                    114:          case RESDOM:
                    115:                format(result->right);
                    116:                return;
                    117: 
                    118:          case INT:
                    119:          case FLOAT:
                    120:          case CHAR:
                    121:                rfrmt = result->sym.type;
                    122:                rfrml = result->sym.len;
                    123:                break;
                    124: 
                    125:          case COP:
                    126:                for (cpt = Coptab; cpt->copname; cpt++)
                    127:                {
                    128:                        if (result->sym.value.sym_op.opno == cpt->copnum)
                    129:                        {
                    130:                                rfrmt = cpt->coptype;
                    131:                                rfrml = cpt->coplen;
                    132:                                break;
                    133:                        }
                    134:                }
                    135:                if (!cpt->copname)
                    136:                        syserr("bad cop in format(%d)", result->sym.value.sym_op.opno);
                    137:                break;
                    138: 
                    139:          case UOP:
                    140:                switch (result->sym.value.sym_op.opno)
                    141:                {
                    142:                  case opATAN:
                    143:                  case opCOS:
                    144: # ifdef        xV6_UNIX
                    145:                  case opGAMMA:
                    146: # endif
                    147:                  case opLOG:
                    148:                  case opSIN:
                    149:                  case opSQRT:
                    150:                  case opEXP:
                    151:                        format(result->left);
                    152:                        if (Trfrmt == CHAR)
                    153:                                /*
                    154:                                ** no character expr in FOP
                    155:                                ** if more ops are added, must change error message                             */
                    156:                                par_error(FOPTYPE, WARN, 0);
                    157: 
                    158:                  case opFLOAT8:
                    159:                        /* float8 is type conversion and can have char values */
                    160:                        rfrmt = FLOAT;
                    161:                        rfrml = 8;
                    162:                        break;
                    163: 
                    164:                  case opFLOAT4:
                    165:                        rfrmt = FLOAT;
                    166:                        rfrml = 4;
                    167:                        break;
                    168: 
                    169:                  case opINT1:
                    170:                        rfrmt = INT;
                    171:                        rfrml = 1;
                    172:                        break;
                    173: 
                    174:                  case opINT2:
                    175:                        rfrmt = INT;
                    176:                        rfrml = 2;
                    177:                        break;
                    178: 
                    179:                  case opINT4:
                    180:                        rfrmt = INT;
                    181:                        rfrml = 4;
                    182:                        break;
                    183: 
                    184:                  case opASCII:
                    185:                        format(result->left);
                    186:                        rfrmt = CHAR;
                    187:                        rfrml = Trfrml;
                    188:                        if (Trfrmt == INT)
                    189:                        {
                    190:                                if (Trfrml == 2)
                    191:                                        rfrml = Out_arg.i2width;
                    192:                                else if (Trfrml == 4)
                    193:                                        rfrml = Out_arg.i4width;
                    194:                                else if (Trfrml == 1)
                    195:                                        rfrml = Out_arg.i1width;
                    196:                                else
                    197:                                        syserr("bad length %d for INT", Trfrml);
                    198:                                break;
                    199:                        }
                    200:                        if (Trfrmt == FLOAT)
                    201:                        {
                    202:                                if (Trfrml == 8)
                    203:                                        rfrml = Out_arg.f8width;
                    204:                                else if (Trfrml == 4)
                    205:                                        rfrml = Out_arg.f4width;
                    206:                                else
                    207:                                        syserr("bad length %d for FLOAT", Trfrml);
                    208:                                break;
                    209:                        }
                    210:                        if (Trfrmt == CHAR)
                    211:                                break;
                    212:                        syserr("bad frmt in opASCII %d", Trfrmt);
                    213: 
                    214:                  case opNOT:
                    215:                        if (!Qlflag)
                    216:                                syserr("opNOT in targ list");
                    217:                        return;
                    218: 
                    219:                  case opMINUS:
                    220:                  case opPLUS:
                    221:                        format(result->right);
                    222:                        if (Trfrmt == CHAR)
                    223:                                /* no chars for these unary ops */
                    224:                                par_error(UOPTYPE, WARN, 0);
                    225:                        return;
                    226: 
                    227:                  case opABS:
                    228:                        format(result->left);
                    229:                        if (Trfrmt == CHAR)
                    230:                                /* no char values in fcn */
                    231:                                par_error(FOPTYPE, WARN, 0);
                    232:                        return;
                    233: 
                    234:                  default:
                    235:                        syserr("bad UOP in format %d", result->sym.value.sym_op.opno);
                    236:                }
                    237:                break;
                    238: 
                    239:          case BOP:
                    240:                switch (result->sym.value.sym_op.opno)
                    241:                {
                    242: 
                    243:                  case opEQ:
                    244:                  case opNE:
                    245:                  case opLT:
                    246:                  case opLE:
                    247:                  case opGT:
                    248:                  case opGE:
                    249:                        if (!Qlflag)
                    250:                                syserr("LBOP in targ list");
                    251:                        format(result->right);
                    252:                        rfrmt = Trfrmt;
                    253:                        format(result->left);
                    254:                        if ((rfrmt == CHAR) != (Trfrmt == CHAR))
                    255:                                /* type conflict on relational operator */
                    256:                                par_error(RELTYPE, WARN, 0);
                    257:                        return;
                    258: 
                    259:                  case opADD:
                    260:                  case opSUB:
                    261:                  case opMUL:
                    262:                  case opDIV:
                    263:                        format(result->left);
                    264:                        rfrmt = Trfrmt;
                    265:                        rfrml = Trfrml;
                    266:                        format(result->right);
                    267:                        if (rfrmt == CHAR || Trfrmt == CHAR)
                    268:                                /* no opns on characters allowed */
                    269:                                par_error(NUMTYPE, WARN, 0);
                    270:                        if (rfrmt == FLOAT || Trfrmt == FLOAT)
                    271:                        {
                    272:                                if (rfrmt == FLOAT && Trfrmt == FLOAT)
                    273:                                {
                    274:                                        if (Trfrml < rfrml)
                    275:                                                rfrml = Trfrml;
                    276:                                }
                    277:                                else if (Trfrmt == FLOAT)
                    278:                                        rfrml = Trfrml;
                    279:                                rfrmt = FLOAT;
                    280:                        }
                    281:                        else
                    282:                                if (Trfrml > rfrml)
                    283:                                        rfrml = Trfrml;
                    284:                        break;
                    285: 
                    286:                  case opMOD:
                    287:                        format(result->left);
                    288:                        rfrmt = Trfrmt;
                    289:                        rfrml = Trfrml;
                    290:                        format(result->right);
                    291:                        if (rfrmt != INT || Trfrmt != INT)
                    292:                                /* mod operator not defined */
                    293:                                par_error(MODTYPE, WARN, 0);
                    294:                        if (Trfrml > rfrml)
                    295:                                rfrml = Trfrml;
                    296:                        break;
                    297: 
                    298:                  case opPOW:
                    299:                        format(result->right);
                    300:                        rfrmt = Trfrmt;
                    301:                        rfrml = Trfrml;
                    302:                        format(result->left);
                    303:                        if (rfrmt == CHAR || Trfrmt == CHAR)
                    304:                                /* no char values for pow */
                    305:                                par_error(NUMTYPE, WARN, 0);
                    306:                        if ((rfrmt == FLOAT && rfrml == 4) || (Trfrmt == FLOAT && Trfrml == 4))
                    307:                        {
                    308:                                rfrmt = FLOAT;
                    309:                                rfrml = 4;
                    310:                        }
                    311:                        else
                    312:                        {
                    313:                                rfrmt = FLOAT;
                    314:                                rfrml = 8;
                    315:                        }
                    316:                        break;
                    317: 
                    318:                  case opCONCAT:
                    319:                        format(result->left);
                    320:                        rfrmt = Trfrmt;
                    321:                        rfrml = Trfrml;
                    322:                        format(result->right);
                    323:                        if (rfrmt != CHAR || Trfrmt != CHAR)
                    324:                                /* only character domains allowed */
                    325:                                par_error(CONCATTYPE, WARN, 0);
                    326:                        rfrml += Trfrml;
                    327:                        break;
                    328: 
                    329:                  default:
                    330:                        syserr("bad BOP in format %d", result->sym.value.sym_op.opno);
                    331:                }
                    332:        }
                    333:        Trfrmt = rfrmt;
                    334:        Trfrml = rfrml;
                    335: # ifdef        xPTR2
                    336:        tTfp(52, 2, "format>>: Trfrmt = %d, Trfrml = %d.\n", Trfrmt, Trfrml);
                    337: # endif
                    338: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.