LCOV - code coverage report
Current view: top level - src/test/modules/test_lfind - test_lfind.c (source / functions) Coverage Total Hit
Test: PostgreSQL 20devel Lines: 77.4 % 84 65
Test Date: 2026-07-25 22:15:46 Functions: 100.0 % 9 9
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 43.0 % 100 43

             Branch data     Line data    Source code
       1                 :             : /*--------------------------------------------------------------------------
       2                 :             :  *
       3                 :             :  * test_lfind.c
       4                 :             :  *      Test correctness of optimized linear search functions.
       5                 :             :  *
       6                 :             :  * Copyright (c) 2022-2026, PostgreSQL Global Development Group
       7                 :             :  *
       8                 :             :  * IDENTIFICATION
       9                 :             :  *      src/test/modules/test_lfind/test_lfind.c
      10                 :             :  *
      11                 :             :  * -------------------------------------------------------------------------
      12                 :             :  */
      13                 :             : 
      14                 :             : #include "postgres.h"
      15                 :             : 
      16                 :             : #include "fmgr.h"
      17                 :             : #include "port/pg_lfind.h"
      18                 :             : 
      19                 :             : /*
      20                 :             :  * Convenience macros for testing both vector and scalar operations. The 2x
      21                 :             :  * factor is to make sure iteration works
      22                 :             :  */
      23                 :             : #define LEN_NO_TAIL(vectortype) (2 * sizeof(vectortype))
      24                 :             : #define LEN_WITH_TAIL(vectortype) (LEN_NO_TAIL(vectortype) + 3)
      25                 :             : 
      26                 :           1 : PG_MODULE_MAGIC;
      27                 :             : 
      28                 :             : /* workhorse for test_lfind8 */
      29                 :             : static void
      30                 :           8 : test_lfind8_internal(uint8 key)
      31                 :             : {
      32                 :             :     uint8       charbuf[LEN_WITH_TAIL(Vector8)];
      33                 :           8 :     const int   len_no_tail = LEN_NO_TAIL(Vector8);
      34                 :           8 :     const int   len_with_tail = LEN_WITH_TAIL(Vector8);
      35                 :             : 
      36                 :           8 :     memset(charbuf, 0xFF, len_with_tail);
      37                 :             :     /* search tail to test one-byte-at-a-time path */
      38                 :           8 :     charbuf[len_with_tail - 1] = key;
      39   [ +  +  -  + ]:           8 :     if (key > 0x00 && pg_lfind8(key - 1, charbuf, len_with_tail))
      40         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8() found nonexistent element '0x%x'", key - 1);
      41   [ +  +  -  + ]:           8 :     if (key < 0xFF && !pg_lfind8(key, charbuf, len_with_tail))
      42         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8() did not find existing element '0x%x'", key);
      43   [ +  +  -  + ]:           8 :     if (key < 0xFE && pg_lfind8(key + 1, charbuf, len_with_tail))
      44         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8() found nonexistent element '0x%x'", key + 1);
      45                 :             : 
      46                 :           8 :     memset(charbuf, 0xFF, len_with_tail);
      47                 :             :     /* search with vector operations */
      48                 :           8 :     charbuf[len_no_tail - 1] = key;
      49   [ +  +  -  + ]:           8 :     if (key > 0x00 && pg_lfind8(key - 1, charbuf, len_no_tail))
      50         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8() found nonexistent element '0x%x'", key - 1);
      51   [ +  +  -  + ]:           8 :     if (key < 0xFF && !pg_lfind8(key, charbuf, len_no_tail))
      52         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8() did not find existing element '0x%x'", key);
      53   [ +  +  -  + ]:           8 :     if (key < 0xFE && pg_lfind8(key + 1, charbuf, len_no_tail))
      54         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8() found nonexistent element '0x%x'", key + 1);
      55                 :           8 : }
      56                 :             : 
      57                 :           2 : PG_FUNCTION_INFO_V1(test_lfind8);
      58                 :             : Datum
      59                 :           1 : test_lfind8(PG_FUNCTION_ARGS)
      60                 :             : {
      61                 :           1 :     test_lfind8_internal(0);
      62                 :           1 :     test_lfind8_internal(1);
      63                 :           1 :     test_lfind8_internal(0x7F);
      64                 :           1 :     test_lfind8_internal(0x80);
      65                 :           1 :     test_lfind8_internal(0x81);
      66                 :           1 :     test_lfind8_internal(0xFD);
      67                 :           1 :     test_lfind8_internal(0xFE);
      68                 :           1 :     test_lfind8_internal(0xFF);
      69                 :             : 
      70                 :           1 :     PG_RETURN_VOID();
      71                 :             : }
      72                 :             : 
      73                 :             : /* workhorse for test_lfind8_le */
      74                 :             : static void
      75                 :           8 : test_lfind8_le_internal(uint8 key)
      76                 :             : {
      77                 :             :     uint8       charbuf[LEN_WITH_TAIL(Vector8)];
      78                 :           8 :     const int   len_no_tail = LEN_NO_TAIL(Vector8);
      79                 :           8 :     const int   len_with_tail = LEN_WITH_TAIL(Vector8);
      80                 :             : 
      81                 :           8 :     memset(charbuf, 0xFF, len_with_tail);
      82                 :             :     /* search tail to test one-byte-at-a-time path */
      83                 :           8 :     charbuf[len_with_tail - 1] = key;
      84   [ +  +  -  + ]:           8 :     if (key > 0x00 && pg_lfind8_le(key - 1, charbuf, len_with_tail))
      85         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8_le() found nonexistent element <= '0x%x'", key - 1);
      86   [ +  +  -  + ]:           8 :     if (key < 0xFF && !pg_lfind8_le(key, charbuf, len_with_tail))
      87         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8_le() did not find existing element <= '0x%x'", key);
      88   [ +  +  -  + ]:           8 :     if (key < 0xFE && !pg_lfind8_le(key + 1, charbuf, len_with_tail))
      89         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8_le() did not find existing element <= '0x%x'", key + 1);
      90                 :             : 
      91                 :           8 :     memset(charbuf, 0xFF, len_with_tail);
      92                 :             :     /* search with vector operations */
      93                 :           8 :     charbuf[len_no_tail - 1] = key;
      94   [ +  +  -  + ]:           8 :     if (key > 0x00 && pg_lfind8_le(key - 1, charbuf, len_no_tail))
      95         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8_le() found nonexistent element <= '0x%x'", key - 1);
      96   [ +  +  -  + ]:           8 :     if (key < 0xFF && !pg_lfind8_le(key, charbuf, len_no_tail))
      97         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8_le() did not find existing element <= '0x%x'", key);
      98   [ +  +  -  + ]:           8 :     if (key < 0xFE && !pg_lfind8_le(key + 1, charbuf, len_no_tail))
      99         [ #  # ]:           0 :         elog(ERROR, "pg_lfind8_le() did not find existing element <= '0x%x'", key + 1);
     100                 :           8 : }
     101                 :             : 
     102                 :           2 : PG_FUNCTION_INFO_V1(test_lfind8_le);
     103                 :             : Datum
     104                 :           1 : test_lfind8_le(PG_FUNCTION_ARGS)
     105                 :             : {
     106                 :           1 :     test_lfind8_le_internal(0);
     107                 :           1 :     test_lfind8_le_internal(1);
     108                 :           1 :     test_lfind8_le_internal(0x7F);
     109                 :           1 :     test_lfind8_le_internal(0x80);
     110                 :           1 :     test_lfind8_le_internal(0x81);
     111                 :           1 :     test_lfind8_le_internal(0xFD);
     112                 :           1 :     test_lfind8_le_internal(0xFE);
     113                 :           1 :     test_lfind8_le_internal(0xFF);
     114                 :             : 
     115                 :           1 :     PG_RETURN_VOID();
     116                 :             : }
     117                 :             : 
     118                 :           2 : PG_FUNCTION_INFO_V1(test_lfind32);
     119                 :             : Datum
     120                 :           1 : test_lfind32(PG_FUNCTION_ARGS)
     121                 :             : {
     122                 :             : #define TEST_ARRAY_SIZE 135
     123                 :           1 :     uint32      test_array[TEST_ARRAY_SIZE] = {0};
     124                 :             : 
     125                 :           1 :     test_array[8] = 1;
     126                 :           1 :     test_array[64] = 2;
     127                 :           1 :     test_array[TEST_ARRAY_SIZE - 1] = 3;
     128                 :             : 
     129         [ -  + ]:           1 :     if (pg_lfind32(1, test_array, 4))
     130         [ #  # ]:           0 :         elog(ERROR, "pg_lfind32() found nonexistent element");
     131         [ -  + ]:           1 :     if (!pg_lfind32(1, test_array, TEST_ARRAY_SIZE))
     132         [ #  # ]:           0 :         elog(ERROR, "pg_lfind32() did not find existing element");
     133                 :             : 
     134         [ -  + ]:           1 :     if (pg_lfind32(2, test_array, 32))
     135         [ #  # ]:           0 :         elog(ERROR, "pg_lfind32() found nonexistent element");
     136         [ -  + ]:           1 :     if (!pg_lfind32(2, test_array, TEST_ARRAY_SIZE))
     137         [ #  # ]:           0 :         elog(ERROR, "pg_lfind32() did not find existing element");
     138                 :             : 
     139         [ -  + ]:           1 :     if (pg_lfind32(3, test_array, 96))
     140         [ #  # ]:           0 :         elog(ERROR, "pg_lfind32() found nonexistent element");
     141         [ -  + ]:           1 :     if (!pg_lfind32(3, test_array, TEST_ARRAY_SIZE))
     142         [ #  # ]:           0 :         elog(ERROR, "pg_lfind32() did not find existing element");
     143                 :             : 
     144         [ -  + ]:           1 :     if (pg_lfind32(4, test_array, TEST_ARRAY_SIZE))
     145         [ #  # ]:           0 :         elog(ERROR, "pg_lfind32() found nonexistent element");
     146                 :             : 
     147                 :           1 :     PG_RETURN_VOID();
     148                 :             : }
        

Generated by: LCOV version 2.0-1