Exemplo n.º 1
0
bool parseJoinColsReply(redisClient *c,
                        char        *y,
                        int          len,
                        int         *numt,
                        int          tmatchs[],
                        int          j_tbls[],
                        int          j_cols[],
                        int        *qcols,
                        bool       *cstar) {
   if (!strcasecmp(y, "COUNT(*)")) {
        *cstar = 1;
        return 1;
    }
    if (*y == '*') {
        for (int i = 0; i < *numt; i++) {
            int tmatch = tmatchs[i];
            for (int j = 0; j < Tbl[server.dbid][tmatch].col_count; j++) {
                j_tbls[*qcols] = tmatch;
                j_cols[*qcols] = j;
                *qcols         = *qcols + 1;
            }
        }
        return 1;
    }

    char *nextp = _strnchr(y, '.', len);
    if (!nextp) {
        addReply(c, shared.indextargetinvalid);
        return 0;
    }

    char *tname  = y;
    int   tlen   = nextp - y;
    int   tmatch = find_table_n(tname, tlen);
    if (tmatch == -1) {
        addReply(c,shared.nonexistenttable);
        return 0;
    }

    char *cname  = nextp + 1;
    int   clen   = len - tlen - 1;
    int   cmatch = find_column_n(tmatch, cname, clen);
    if (cmatch == -1) {
        addReply(c,shared.nonexistentcolumn);
        return 0;
    }

    j_tbls[*qcols] = tmatch;
    j_cols[*qcols] = cmatch;
    *qcols         = *qcols + 1;
    return 1;
}
Exemplo n.º 2
0
bool parseSelectCol(int   tmatch,
                    char *cname,
                    int   clen,
                    int   cmatchs[],
                    int  *qcols,
                    bool *cstar) {
    if (*cname == '*') {
        *qcols = get_all_cols(tmatch, cmatchs);
        return 1;
    }
    if (!strcasecmp(cname, "COUNT(*)")) {
        *cstar = 1;
        *qcols = 1;
        return 1;
    }
    int cmatch = find_column_n(tmatch, cname, clen);
    if (cmatch == -1) return 0;
    cmatchs[*qcols] = cmatch;
    *qcols = *qcols + 1;
    return 1;
}
Exemplo n.º 3
0
int parseUpdateColListReply(redisClient  *c,
                            int           tmatch,
                            char         *vallist,
                            int           cmatchs[],
                            char         *vals   [],
                            uint32        vlens  []) {
    int qcols = 0;
    while (1) {
        char *val = strchr(vallist, '=');
        if (!val) {
            addReply(c, shared.invalidupdatestring);
            return 0;
        }
        char *endval = val - 1;
        while (isblank(*endval)) endval--;
        val++;
        while (isblank(*val)) val++;

        int cmatch = find_column_n(tmatch, vallist, (endval - vallist + 1));
        if (cmatch == -1) {
            addReply(c, shared.nonexistentcolumn);
            return 0;
        }

        char   *nextc   = str_next_unescaped_chr(val, val, ',');
        uint32  val_len = nextc ? nextc - val : (uint32)strlen(val);
        cmatchs[qcols]  = cmatch;
        vals   [qcols]  = val;
        vlens  [qcols]  = val_len;
        qcols++;

        if (!nextc) break;
        nextc++;
        while (isblank(*nextc)) nextc++;
        vallist = nextc;
    }
    return qcols;
}
Exemplo n.º 4
0
/* Parses "xxx$col1 yyy$col2 zzz" -> "xxx[col1] yyy[col2] zzz" */
bool parseNRLcmd(char *o_s, list *nrltoks, list *nrlcols, int tmatch) {
    char *s   = strchr(o_s, '$');
    if (!s) {
       listAddNodeTail(nrltoks, sdsdup(o_s)); /* freed in freeNrlIndexObject */
    } else {
        while (1) {
            s++; /* advance past "$" */
            char *nxo  = s;
            while (isalnum(*nxo) || *nxo == '_') nxo++; /* col must be alpnum */
            int   cmatch = find_column_n(tmatch, s, nxo - s);
            if (cmatch == -1) return 0;
            listAddNodeTail(nrlcols, (void *)(long)(cmatch + 1)); /* 0!=NULL */
            listAddNodeTail(nrltoks, sdsnewlen(o_s, (s - 1) - o_s)); /*no "$"*/
            char *nexts  = strchr(s, '$');              /* var is '$' delimed */
            if (!nexts) { /* no more vars */
                if (*nxo) listAddNodeTail(nrltoks, sdsnewlen(nxo, strlen(nxo)));
                break;
            }
            o_s = nxo;
            s   = nexts;
        }
    }
    return 1;
}
Exemplo n.º 5
0
bool parseExprReply(redisClient *c,
                    char         e,
                    int          tmatch,
                    int          cmatch,
                    uchar        ctype,
                    char        *val,
                    uint32       vlen,
                    ue_t        *ue) {
    char  *cname = val;
    while (isblank(*cname)) cname++;       /* cant fail "e" already found */
    char  *espot = _strnchr(val, e, vlen); /* cant fail - "e" already found */
    if (((espot - val) == (vlen - 1)) ||
        ((e == STRCAT) && ((espot - val) == (vlen - 2)))) {
        addReply(c, shared.update_expr);
        return 0;
    }
    char  *cend     = espot - 1;
    while (isblank(*cend)) cend--;
    int    uec1match = find_column_n(tmatch, cname, cend - cname + 1);
    if (uec1match == -1) {
        addReply(c, shared.update_expr_col);
        return 0;
    }
    if (uec1match != cmatch) {
        addReply(c, shared.update_expr_col_other);
        return 0;
    }
    char *pred = espot + 1;
    if (e == STRCAT) pred++;
    while (isblank(*pred)) {        /* find predicate (after blanks) */
        pred++;
        if ((pred - val) == vlen) {
            addReply(c, shared.update_expr);
            return 0;
        }
    }
    char *pend = val + vlen -1;     /* start from END */
    while (isblank(*pend)) pend--;  /* find end of predicate */
    int   plen  = pend - pred + 1;
    uchar uetype = determineExprType(pred, plen);

    if (uetype == UETYPE_ERR) {
        addReply(c, shared.update_expr_col);
        return 0;
    }

    /* RULES FOR UPDATE EXPRESSIONS */
    if (uetype == UETYPE_STRING && ctype != COL_TYPE_STRING) {
        addReply(c, shared.update_expr_math_str);
        return 0;
    }
    if (e == MODULO && ctype != COL_TYPE_INT) {
        addReply(c, shared.update_expr_mod);
        return 0;
    }
    if (e == STRCAT && (ctype != COL_TYPE_STRING || uetype != UETYPE_STRING)) {
        addReply(c, shared.update_expr_cat);
        return 0;
    }
    if (ctype == COL_TYPE_STRING && e != STRCAT) {
        addReply(c, shared.update_expr_str);
        return 0;
    }

    if (uetype == UETYPE_STRING) { /* ignore string delimiters */
        pred++;
        plen -= 2;
        if (plen == 0) {
            addReply(c, shared.update_expr_empty_str);
            return 0;
        }
    }

    ue->c1match = uec1match;
    ue->type    = uetype;
    ue->pred    = pred;
    ue->plen    = plen;
    ue->op      = e;
    return 1;
}