LCOV - code coverage report
Current view: top level - sql/common - sql_keyword.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 50 50 100.0 %
Date: 2024-04-26 00:35:57 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /*
       2             :  * SPDX-License-Identifier: MPL-2.0
       3             :  *
       4             :  * This Source Code Form is subject to the terms of the Mozilla Public
       5             :  * License, v. 2.0.  If a copy of the MPL was not distributed with this
       6             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       7             :  *
       8             :  * Copyright 2024 MonetDB Foundation;
       9             :  * Copyright August 2008 - 2023 MonetDB B.V.;
      10             :  * Copyright 1997 - July 2008 CWI.
      11             :  */
      12             : 
      13             : #include "monetdb_config.h"
      14             : #include "sql_mem.h"
      15             : #include "sql_string.h"
      16             : #include "sql_keyword.h"
      17             : 
      18             : #define HASH_SIZE 32768
      19             : #define HASH_MASK (HASH_SIZE-1)
      20             : 
      21             : static int keywords_init_done = 0;
      22             : static keyword *keywords[HASH_SIZE];
      23             : 
      24             : static int
      25    13311210 : keyword_key(char *k, int *l)
      26             : {
      27    13311210 :         char *s = k;
      28    13311210 :         unsigned int h = 1;
      29             : 
      30    79952098 :         while (*k) {
      31    66640888 :                 h <<= 5;
      32    66640888 :                 h += (*k - 'a');
      33    66640888 :                 k++;
      34             :         }
      35    13311210 :         *l = (int) (k - s);
      36    13311210 :         h <<= 4;
      37    13311210 :         h += *l;
      38    13311210 :         return (int) ((h & 0x80000000) ? ~h + 1 : h);
      39             : }
      40             : 
      41             : int
      42      150350 : keywords_insert(char *k, int token)
      43             : {
      44      150350 :         keyword *kw = MNEW(keyword);
      45      150350 :         if(kw) {
      46      150350 :                 int len = 0;
      47      150350 :                 int bucket = keyword_key(k = toLower(k), &len) & HASH_MASK;
      48             : #ifndef NDEBUG
      49             :                 /* no duplicate keywords */
      50      150350 :                 keyword *kw2;
      51      184791 :                 for (kw2 = keywords[bucket]; kw2; kw2 = kw2->next)
      52       34441 :                         assert(strcmp(kw2->keyword, k) != 0);
      53             : #endif
      54             : 
      55      150350 :                 *kw = (keyword) {
      56             :                         .keyword = k,
      57             :                         .len = len,
      58             :                         .token = token,
      59             :                         .next = keywords[bucket],
      60             :                 };
      61      150350 :                 keywords[bucket] = kw;
      62      150350 :                 return 0;
      63             :         } else {
      64             :                 return -1;
      65             :         }
      66             : }
      67             : 
      68             : keyword *
      69    13160753 : find_keyword(char *text)
      70             : {
      71    13160753 :         int len = 0;
      72    13160753 :         int bucket = keyword_key(mkLower(text), &len) & HASH_MASK;
      73    13160985 :         keyword *k = keywords[bucket];
      74             : 
      75    15895472 :         while (k) {
      76    10786625 :                 if (len == k->len && strcmp(k->keyword, text) == 0)
      77     8052138 :                         return k;
      78             : 
      79     2734487 :                 k = k->next;
      80             :         }
      81             :         return NULL;
      82             : }
      83             : 
      84             : int
      85       10504 : keyword_exists(char *text)
      86             : {
      87       10504 :         if (find_keyword(text)) {
      88        7128 :                 return 1;
      89             :         }
      90             :         return 0;
      91             : }
      92             : 
      93             : void
      94         341 : keyword_init(void)
      95             : {
      96         341 :         int i;
      97             : 
      98         341 :         if (keywords_init_done)
      99             :                 return;
     100         341 :         keywords_init_done = 1;
     101             : 
     102    11174229 :         for (i = 0; i < HASH_SIZE; i++)
     103    11173888 :                 keywords[i] = NULL;
     104             : }
     105             : 
     106             : void
     107         340 : keyword_exit(void)
     108             : {
     109         340 :         int i;
     110             : 
     111         340 :         if (keywords_init_done == 0)
     112             :                 return;
     113         340 :         keywords_init_done = 0;
     114             : 
     115    11141460 :         for (i = 0; i < HASH_SIZE; i++) {
     116    11141120 :                 keyword *k = keywords[i];
     117             : 
     118    11141120 :                 while (k) {
     119      149911 :                         keyword *l = k;
     120             : 
     121      149911 :                         k = k->next;
     122      149911 :                         _DELETE(l->keyword);
     123             : 
     124    11291031 :                         _DELETE(l);
     125             :                 }
     126             :         }
     127             : }

Generated by: LCOV version 1.14