MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / par_case

Function par_case

src/gpre/sqe.cpp:1881–1955  ·  view source on GitHub ↗

____________________________________________________________ Parse a CASE clause There are two types of CASE clauses. 1) CASE WHEN (cond1) THEN value1 ... ELSE else_value END which is returned as nod_case In this case nod_arg[0] = cond1, nod_arg[1] = value1, ... nod_arg[n] = else_value 2) CASE value0 WHEN test_value1 THEN match_value1 ... ELSE else_value END which is returned as nod_case1 In thi

Source from the content-addressed store, hash-verified

1879// nod_arg[n] = else_value
1880//
1881static gpre_nod* par_case(gpre_req* request)
1882{
1883 gpre_lls* stack = NULL;
1884 int count = 0;
1885 nod_t nod_type;
1886
1887 if (MSC_match(KW_WHEN))
1888 {
1889 // Case 1 - CASE WHEN cond1 THEN value1 ...
1890 nod_type = nod_case;
1891 count++;
1892 MSC_push(SQE_boolean(request, NULL), &stack);
1893
1894 while (MSC_match(KW_THEN))
1895 {
1896 count++;
1897 MSC_push(SQE_value_or_null(request, false, NULL, NULL), &stack);
1898 if (MSC_match(KW_WHEN))
1899 {
1900 count++;
1901 MSC_push(SQE_boolean(request, NULL), &stack);
1902 }
1903 }
1904
1905 // If we have an odd number of nodes then we are missing a THEN
1906 if ((count % 2) == 1)
1907 {
1908 CPR_s_error("THEN");
1909 }
1910 }
1911 else
1912 {
1913 // Case 2 - CASE value0 WHEN test_value1 THEN match_value1 ...
1914 nod_type = nod_case1;
1915 count++;
1916 MSC_push(SQE_value_or_null(request, false, NULL, NULL), &stack);
1917
1918 while (MSC_match(KW_WHEN))
1919 {
1920 count++;
1921 MSC_push(SQE_value_or_null(request, false, NULL, NULL), &stack);
1922 if (MSC_match(KW_THEN))
1923 {
1924 count++;
1925 MSC_push(SQE_value_or_null(request, false, NULL, NULL), &stack);
1926 }
1927 else
1928 {
1929 CPR_s_error("THEN");
1930 }
1931 }
1932 }
1933
1934 // ELSE else_value END
1935 if (MSC_match(KW_ELSE))
1936 {
1937 count++;
1938 MSC_push(SQE_value_or_null(request, false, NULL, NULL), &stack);

Callers 1

par_udfFunction · 0.70

Calls 7

MSC_matchFunction · 0.85
MSC_pushFunction · 0.85
SQE_booleanFunction · 0.85
SQE_value_or_nullFunction · 0.85
CPR_s_errorFunction · 0.85
MSC_nodeFunction · 0.85
MSC_popFunction · 0.85

Tested by

no test coverage detected