char *holder_name;
regex_t *re;
- unsigned int has_value :1;
+ unsigned int fetched :1, /* holder requested */
+ empty : 1;
};
static int cast_param(int type, struct filter_param *n);
}
n->type = type;
- n->has_value = 1;
+ n->empty = data == NULL;
return 0;
}
free(n->val.str);
memset(&n->val, 0, sizeof(n->val));
- n->has_value = 0;
+ n->fetched = 0;
+ n->empty = 1;
if (n->re) {
regfree(n->re);
{
ul_jsonwrt_object_open(json, "param");
- if (!n->has_value) {
- ul_jsonwrt_value_boolean(json, "has_value", false);
+ if (n->empty) {
+ ul_jsonwrt_value_boolean(json, "empty", true);
ul_jsonwrt_value_s(json, "type", datatype2str(n->type));
} else {
switch (n->type) {
int type = n->type;
int rc = 0;
- if (n->has_value || n->holder != F_HOLDER_COLUMN)
+ if (n->fetched || n->holder != F_HOLDER_COLUMN)
return 0;
if (!cl) {
DBG(FPARAM, ul_debugobj(n, "no column for %s holder", n->holder_name));
return rc;
}
+ n->fetched = 1;
+
if (cl->datafunc) {
struct libscols_cell *ce = scols_line_get_column_cell(ln, cl);
void *data = NULL;
DBG(FLTR, ul_debugobj(fltr, "eval param"));
rc = fetch_holder_data(fltr, n, ln);
- if (!n->has_value || rc) {
+ if (n->empty || rc) {
*status = 0;
goto done;
}
if (rc)
return rc;
}
- if (!ct->param->has_value)
+ if (ct->param->empty)
return -EINVAL;
num = ct->param->val.num;
static int u64_opers(enum filter_etype oper, struct filter_param *l,
struct filter_param *r, int *status)
{
+ if (l->empty || r->empty) {
+ *status = 0;
+ return 0;
+ }
+
switch (oper) {
case F_EXPR_EQ:
*status = l->val.num == r->val.num;
static int float_opers(enum filter_etype oper, struct filter_param *l,
struct filter_param *r, int *status)
{
+ if (l->empty || r->empty) {
+ *status = 0;
+ return 0;
+ }
+
switch (oper) {
case F_EXPR_EQ:
*status = l->val.fnum == r->val.fnum;
static int bool_opers(enum filter_etype oper, struct filter_param *l,
struct filter_param *r, int *status)
{
+ if (l->empty || r->empty) {
+ *status = 0;
+ return 0;
+ }
+
switch (oper) {
case F_EXPR_EQ:
*status = l->val.boolean == r->val.boolean;