Skip to content

Commit 86dd044

Browse files
committed
intro. unsigned for sql expression parser
Support of `unsigned` type implemented the same way as it's done for signed integer (64 bit form only).
1 parent 4f93c6e commit 86dd044

File tree

8 files changed

+245
-106
lines changed

8 files changed

+245
-106
lines changed

src/core/ddsc/include/dds/dds.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,6 +1665,7 @@ struct dds_content_filter {
16651665

16661666
DDS_EXPORT dds_return_t dds_expression_filter_create (const char *expression, dds_expression_content_filter_t **filter);
16671667
DDS_EXPORT void dds_expression_filter_free (dds_expression_content_filter_t *filter);
1668+
DDS_EXPORT dds_return_t dds_expression_filter_bind_unsigned (dds_expression_content_filter_t *filter, size_t id, uint64_t param);
16681669
DDS_EXPORT dds_return_t dds_expression_filter_bind_integer (dds_expression_content_filter_t *filter, size_t id, int64_t param);
16691670
DDS_EXPORT dds_return_t dds_expression_filter_bind_real (dds_expression_content_filter_t *filter, size_t id, double param);
16701671
DDS_EXPORT dds_return_t dds_expression_filter_bind_string (dds_expression_content_filter_t *filter, size_t id, char *param);

src/core/ddsc/src/dds__content_filter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
extern "C" {
1818
#endif
1919

20-
/* #define DDS_EXPR_FILTER_PARAM_UINTEGER DDS_SLQ_TK_UINT */
2120
#define DDS_EXPR_FILTER_PARAM_INTEGER DDS_SQL_TK_INTEGER
21+
#define DDS_EXPR_FILTER_PARAM_UNSIGNED DDS_SQL_TK_UNSIGNED
2222
#define DDS_EXPR_FILTER_PARAM_REAL DDS_SQL_TK_FLOAT
2323
#define DDS_EXPR_FILTER_PARAM_STRING DDS_SQL_TK_STRING
2424
#define DDS_EXPR_FILTER_PARAM_BLOB DDS_SQL_TK_BLOB
@@ -27,7 +27,7 @@ struct dds_expression_filter_param
2727
{
2828
int t;
2929
union {
30-
int64_t i; double d;
30+
int64_t i; double d; uint64_t u;
3131
} n;
3232
union {
3333
char *s;

src/core/ddsc/src/dds__sql_expr.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ extern "C" {
5959
#define DDS_SQL_TK_SPACE 184
6060
#define DDS_SQL_TK_COMMENT 185
6161
#define DDS_SQL_TK_ILLEGAL 186
62+
#define DDS_SQL_TK_UNSIGNED 189
6263

6364
#define DDS_SQL_AFFINITY_NONE 0x40 /* '@' */
6465
#define DDS_SQL_AFFINITY_BLOB 0x41 /* 'A' */
@@ -85,9 +86,7 @@ struct dds_sql_token {
8586
union {
8687
double r; // DDS_SQL_TK_FLOAT
8788
int64_t i; // DDS_SQL_TK_INTEGER
88-
/* FIXME:
8989
uint64_t u; // DDS_SQL_TK_UNSIGNED
90-
*/
9190
} n;
9291
char *s; // DDS_SQL_TK_BLOB/DDS_SQL_TK_STRING
9392
/* FIXME:
@@ -170,10 +169,11 @@ void dds_sql_expr_fini(struct dds_sql_expr *expr);
170169

171170
dds_return_t dds_sql_expr_parse(const unsigned char *s, struct dds_sql_expr **ex);
172171

173-
dds_return_t dds_sql_expr_bind_integer(const struct dds_sql_expr *ex, uintptr_t i, int64_t p);
174-
dds_return_t dds_sql_expr_bind_real (const struct dds_sql_expr *ex, uintptr_t i, double p);
175-
dds_return_t dds_sql_expr_bind_string (const struct dds_sql_expr *ex, uintptr_t i, char s[]);
176-
dds_return_t dds_sql_expr_bind_blob (const struct dds_sql_expr *ex, uintptr_t i, unsigned char b[], size_t s);
172+
dds_return_t dds_sql_expr_bind_unsigned (const struct dds_sql_expr *ex, uintptr_t i, uint64_t p);
173+
dds_return_t dds_sql_expr_bind_integer (const struct dds_sql_expr *ex, uintptr_t i, int64_t p);
174+
dds_return_t dds_sql_expr_bind_real (const struct dds_sql_expr *ex, uintptr_t i, double p);
175+
dds_return_t dds_sql_expr_bind_string (const struct dds_sql_expr *ex, uintptr_t i, char s[]);
176+
dds_return_t dds_sql_expr_bind_blob (const struct dds_sql_expr *ex, uintptr_t i, unsigned char b[], size_t s);
177177

178178
dds_return_t dds_sql_expr_build(const struct dds_sql_expr *ex, struct dds_sql_expr **out);
179179
dds_return_t dds_sql_expr_eval(const struct dds_sql_expr *ex, struct dds_sql_token **out);

src/core/ddsc/src/dds_content_filter.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ static dds_return_t expression_filter_param_set (dds_expression_content_filter_t
7272
return filter_param_copy(&p, &ef->param[id-1]) ? DDS_RETCODE_OK: DDS_RETCODE_BAD_PARAMETER;
7373
}
7474

75+
dds_return_t dds_expression_filter_bind_unsigned (dds_expression_content_filter_t *filter, size_t id, uint64_t param)
76+
{
77+
struct dds_expression_filter_param p = {.t = DDS_EXPR_FILTER_PARAM_UNSIGNED, .n.u = param};
78+
return expression_filter_param_set(filter, id, p);
79+
}
80+
7581
dds_return_t dds_expression_filter_bind_integer (dds_expression_content_filter_t *filter, size_t id, int64_t param)
7682
{
7783
struct dds_expression_filter_param p = {.t = DDS_EXPR_FILTER_PARAM_INTEGER, .n.i = param};

src/core/ddsc/src/dds_filter.c

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
ret = dds_sql_expr_bind_integer (e, i ,*v); \
4141
} else { \
4242
u##t *v = (u##t *) (so); \
43-
ret = dds_sql_expr_bind_integer (e, i, *v); \
43+
ret = dds_sql_expr_bind_unsigned (e, i, *v); \
4444
} \
4545
assert (ret == DDS_RETCODE_OK); \
4646
} while (0);
@@ -93,20 +93,7 @@ static dds_return_t expr_var_set (const struct dds_expression_filter *filter, co
9393
break;
9494
}
9595
case DDS_OP_VAL_8BY: {
96-
if (op_flags & DDS_OP_FLAG_SGN) {
97-
const int64_t *j = (const int64_t *)smpl;
98-
ret = dds_sql_expr_bind_integer (filter->bin_expr, id, *j);
99-
} else {
100-
/* FIXME:
101-
* current implementation doesn't support 64 bit unsigned, since sql
102-
* expression evaluator have nothing to handle that type. */
103-
const uint64_t *j = (const uint64_t *)smpl;
104-
if ((*j) > UINT32_MAX)
105-
ret = DDS_RETCODE_UNSUPPORTED;
106-
else
107-
ret = dds_sql_expr_bind_integer (filter->bin_expr, id, (int64_t)(*j));
108-
}
109-
assert (ret == DDS_RETCODE_OK);
96+
DDS_EXPR_VAR_SET_INTEGER(op_flags, filter->bin_expr, smpl, id, int64_t);
11097
break;
11198
}
11299
default: assert (false);
@@ -280,6 +267,9 @@ static dds_return_t topic_expr_filter_param_rebind (struct dds_filter *a, const
280267
case DDS_EXPR_FILTER_PARAM_INTEGER:
281268
ret = dds_sql_expr_bind_integer(expr, id, param.n.i);
282269
break;
270+
case DDS_EXPR_FILTER_PARAM_UNSIGNED:
271+
ret = dds_sql_expr_bind_unsigned(expr, id, param.n.u);
272+
break;
283273
case DDS_EXPR_FILTER_PARAM_REAL:
284274
ret = dds_sql_expr_bind_real(expr, id, param.n.d);
285275
break;

0 commit comments

Comments
 (0)