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

unix.superglobalmegacorp.com

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