A powerful expression parser/analyzer provides for complex conditional expressions that can be defined and evaluated at runtime.
Filter expression syntax closely follows the C language syntax for expressions, including order of precedence. An expression interpreted by the expression parser should compile without errors with a standard C compiler. As in C, you cannot compare strings directly like LastName > 'S'. However, the expression parser has a number of builtin functions that allow the comparison of strings. Example:
strcmp( LastName, "S" ) > 0
The expression handling assures proper alignment considerations are handled, and ensures buffer size of any record being evaluated is big enough.
Routines that evaluate conditional expressions maintain fixed data record lengths and total data record lengths. This permits correct alignment adjustments and detects if insufficient data is available. The latter condition results in a CVAL_ERR (598) error. The easiest way to produce a CVAL_ERR (598) is to read only the fixedlength portion of a data record, and have an expression that relies on fields in the variablelength portion of the record.
For additional control, a Conditional Expression Callback Function is available. This allows advanced control through an external user created function.
See also
The expression parser uses the constants below internally as a 32bit signed or unsigned integer:
{d'yyyy[m]n[d]d'}
yyyy is 4 digit year
[m]m is 1 or 2 digit month
[d]d is 1 or 2 digit day
Examples:
{d'20241206'}
{d'202486'}
'[m]m[d]dyyyy' or '[m]m/[d]d/yyyy'
yyyy is 4 digit year
[m]m is 1 or 2 digit month
[d]d is 1 or 2 digit day
Examples:
'12062024'
'862024'
'8/6/2024'
'yyyy[m]m[d]d' or 'yyyy/[m]m/[d]d'
yyyy is 4 digit year
[m]m is 1 or 2 digit month
[d]d is 1 or 2 digit day
Examples:
'20241206'
'202486'
'2024/8/6'
'[d]dmmmyyyy' or '[d]d/mmm/yyyy'
[d]d is 1 or 2 digit day
mmm is 3 letter month name
yyyy is 4 digit year
month names (case insensitive) are:
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
Examples:
'1/jan/2024'
'12feb2024'
{t'[h]h:[m]m:[s]s'}
[h]h is 1 or 2 digit hour
[m]m is 1 or 2 digit minute
[s]s is 1 or 2 digit second
Examples:
{t'23:11:33'}
{t'1:2:3'}
'[h]h:[m]m:[s]s[:[i][i]i]'
[h]h is 1 or 2 digit hour
[m]m is 1 or 2 digit minute
[s]s is 1 or 2 digit second
[i][i]i is optional 1 to 3 digit millisecond
Examples:
'1:2:3'
'12:33:44.123'
{ts'yyyy[m]m[d]d [h]h:M[M]:s[s]'}
yyyy is 4 digit year
[m]m is 1 or 2 digit month
[d]d is 1 or 2 digit day
[h]h is 1 or 2 digit hour
[M]M is 1 or 2 digit minute
[s]s is 1 or 2 digit second
Examples:
{ts'20240812 22:33:44'}
{ts'20240812 2:3:4'}
'[m]m[d]dyyyy [h]h:[M]M:[s]s[:[i][i]i]' or '[m]m/[d]d/yyyy [h]h:[M]M:[s]s[:[i][i]i]'
[m]m is 1 or 2 digit month
[d]d is 1 or 2 digit day
yyyy is 4 digit year
[h]h is 1 or 2 digit hour
[M]M is 1 or 2 digit minute
[s]s is 1 or 2 digit second
[i][i]i is optional 1 to 3 digit millisecond
Examples:
'08122024 22:33:44'
'08/12/2024 2:3:4.123'
'yyyy[m]m[d]d [h]h:[M]M:[s]s[:[i][i]i]' or 'yyyy/[m]m/[d]d [h]h:[M]M:[s]s[:[i][i]i]'
yyyy is 4 digit year
[m]m is 1 or 2 digit month
[d]d is 1 or 2 digit day
[h]h is 1 or 2 digit hour
[M]M is 1 or 2 digit minute
[s]s is 1 or 2 digit second
[i][i]i is optional 1 to 3 digit millisecond
Examples:
'20240812 22:33:44'
'2024/08/12 2:3:4.123'
'[d]dmmmyyyy [h]h:[M]M:[s]s[:[i][i]i]' or '[d]d/mmm/yyyy [h]h:[M]M:[s]s[:[i][i]i]'
[d]d is 1 or 2 digit day
mmm is 3 letter month name
yyyy is 4 digit year
[h]h is 1 or 2 digit hour
[M]M is 1 or 2 digit minute
[s]s is 1 or 2 digit second
[i][i]i is optional 1 to 3 digit millisecond
month names (case insensitive) are:
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
Examples:
'08dec2024 22:33:44'
'08/dec/2024 2:3:4.123'
Any integer larger than the maximum size allowed for integers, or any number with decimal points, or any numbers in scientific notation are interpreted as a floating point constant by the expression parser .
String constants are similar to C string constants and represent any text enclosed by double quotes, for example, "This is a string". The maximum size of a string constant defaults to 255 characters. The filter expression parser allows the following escape characters in string constants or character constants:
Escape char 
Value 
Explanation 

\a or \A 
ASCII 7 
bell 
\b or \B 
ASCII 8 
backspace 
\f or \F 
ASCII 12 
Form Feed 
\n or \N 
ASCII 10 
Linefeed 
\r or \R 
ASCII 13 
Carriage Return 
\t or \T 
ASCII 9 
tab 
\v or \V 
ASCII 11 
vertical tab 
\\ 


\any 

Any character not listed above 
A filter expression variable is actually the name of the fields defined for the table. There is a limit of 128 characters for the name of variables and the names are case sensitive.
When a user specifies a variable name, the filter parser searches the table definition for a field of that name. The parser uses the type of the field and converts it to the types used internally by the expression evaluator. The conversion of field types is as follows:
Field Type 
Data Type 
Field Type 
Data Type 

CT_BOOL 
int 
CT_SFLOAT 
double 
CT_CHAR 
int 
CT_DFLOAT 
double 
CT_CHARU 
unsigned 
CT_FSTRING 
char* 
CT_INT2 
int 
CT_FPSTRING 
char* 
CT_INT2U 
unsigned 
CT_F2STRING 
char* 
CT_INT4 
int 
CT_F4STRING 
char* 
CT_INT4U 
unsigned 
CT_STRING 
char* 
CT_DATE 
unsigned 
CT_PSTRING 
char* 
CT_TIME 
unsigned 
CT_2STRING 
char* 
CT_MONEY 
int 
CT_4STRING 
char* 
Please note that "int" is a LONG, "unsigned" is a ULONG and "char*" is a pTEXT.
Field names that match a valid expression reserved word:
Consider a field named "year", which collides with the function YEAR. The expression "[year] == 2000" is needed to handle "year" as a field name rather than the function.
Use parentheses exactly like they are used in C expressions. There are no limits on the number of parentheses you may use in an expression, as long as each open parenthesis has a closing parenthesis. Parentheses are also used to enclose the arguments of builtin functions.