____________________________________________________________ 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
| 1879 | // nod_arg[n] = else_value |
| 1880 | // |
| 1881 | static 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); |
no test coverage detected