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; }
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; }
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; }
/* 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; }
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; }