LCOV - code coverage report
Current view: top level - sql/server - rel_semantic.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 84 99 84.8 %
Date: 2024-10-04 20:04:04 Functions: 2 2 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_parser.h"
      15             : #include "sql_symbol.h"
      16             : #include "rel_semantic.h"
      17             : #include "rel_select.h"
      18             : #include "rel_updates.h"
      19             : #include "rel_trans.h"
      20             : #include "rel_schema.h"
      21             : #include "rel_psm.h"
      22             : #include "rel_sequence.h"
      23             : #include "rel_exp.h"
      24             : #include "sql_privileges.h"
      25             : 
      26             : #include <unistd.h>
      27             : #include <string.h>
      28             : #include <ctype.h>
      29             : 
      30             : sql_rel *
      31      196361 : rel_parse(mvc *m, sql_schema *s, const char *query, char emode)
      32             : {
      33      196361 :         sql_rel *rel = NULL;
      34      196361 :         buffer *b;
      35      196361 :         bstream *bs;
      36      196361 :         stream *buf;
      37      196361 :         char *n;
      38      196361 :         size_t len = _strlen(query);
      39      196361 :         sql_schema *c = cur_schema(m);
      40      196361 :         sql_query *qc = NULL;
      41             : 
      42      196361 :         if ((b = malloc(sizeof(buffer))) == NULL)
      43             :                 return NULL;
      44      196361 :         if ((n = malloc(len + 1 + 1)) == NULL) {
      45           0 :                 free(b);
      46           0 :                 return sql_error(m, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
      47             :         }
      48      196361 :         snprintf(n, len + 2, "%s\n", query);
      49      196361 :         len++;
      50      196361 :         buffer_init(b, n, len);
      51      196361 :         buf = buffer_rastream(b, "sqlstatement");
      52      196361 :         if(buf == NULL) {
      53           0 :                 buffer_destroy(b);
      54           0 :                 return sql_error(m, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
      55             :         }
      56      196361 :         bs = bstream_create(buf, b->len);
      57      196361 :         if(bs == NULL) {
      58           0 :                 buffer_destroy(b);
      59           0 :                 return sql_error(m, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
      60             :         }
      61      196361 :         mvc o = *m;
      62      196361 :         scanner_init( &m->scanner, bs, NULL);
      63      196361 :         m->scanner.mode = LINE_1;
      64      196361 :         bstream_next(m->scanner.rs);
      65             : 
      66      196361 :         m->qc = NULL;
      67      196361 :         m->emode = emode;
      68      196361 :         if (s)
      69      196360 :                 m->session->schema = s;
      70      196361 :         m->params = NULL;
      71      196361 :         m->sym = NULL;
      72      196361 :         m->errstr[0] = '\0';
      73      196361 :         m->session->status = 0;
      74             :         /* via views we give access to protected objects */
      75      196361 :         assert(emode == m_instantiate || emode == m_deps || emode == m_prepare);
      76      196361 :         m->user_id = USER_MONETDB;
      77             : 
      78      196361 :         (void) sqlparse(m);     /* blindly ignore errors */
      79      196361 :         qc = query_create(m);
      80      196361 :         rel = rel_semantic(qc, m->sym);
      81             : 
      82      196361 :         buffer_destroy(b);
      83      196361 :         bstream_destroy(m->scanner.rs);
      84             : 
      85      196361 :         m->sym = NULL;
      86      196361 :         o.frames = m->frames;        /* may have been realloc'ed */
      87      196361 :         o.sizeframes = m->sizeframes;
      88      196361 :         if (m->session->status || m->errstr[0]) {
      89          13 :                 int status = m->session->status;
      90             : 
      91          13 :                 strcpy(o.errstr, m->errstr);
      92          13 :                 *m = o;
      93          13 :                 m->session->status = status;
      94             :         } else {
      95      196348 :                 unsigned int label = m->label, nid = m->nid;
      96             : 
      97      196348 :                 while (m->topframes > o.topframes)
      98           0 :                         clear_frame(m, m->frames[--m->topframes]);
      99      196348 :                 *m = o;
     100      196348 :                 m->label = label;
     101      196348 :                 m->nid = nid;
     102             :         }
     103      196361 :         m->session->schema = c;
     104      196361 :         return rel;
     105             : }
     106             : 
     107             : sql_rel *
     108      790344 : rel_semantic(sql_query *query, symbol *s)
     109             : {
     110      790344 :         mvc *sql = query->sql;
     111      790344 :         if (!s)
     112             :                 return NULL;
     113             : 
     114      790344 :         switch (s->token) {
     115             : 
     116        3157 :         case TR_COMMIT:
     117             :         case TR_SAVEPOINT:
     118             :         case TR_RELEASE:
     119             :         case TR_ROLLBACK:
     120             :         case TR_START:
     121             :         case TR_MODE:
     122        3157 :                 return rel_transactions(query, s);
     123             : 
     124      219177 :         case SQL_CREATE_SCHEMA:
     125             :         case SQL_DROP_SCHEMA:
     126             : 
     127             :         case SQL_DECLARE_TABLE:
     128             :         case SQL_CREATE_TABLE:
     129             :         case SQL_CREATE_VIEW:
     130             :         case SQL_DROP_TABLE:
     131             :         case SQL_DROP_VIEW:
     132             :         case SQL_ALTER_TABLE:
     133             : 
     134             :         case SQL_COMMENT:
     135             : 
     136             :         case SQL_GRANT:
     137             :         case SQL_REVOKE:
     138             :         case SQL_GRANT_ROLES:
     139             :         case SQL_REVOKE_ROLES:
     140             : 
     141             :         case SQL_CREATE_ROLE:
     142             :         case SQL_DROP_ROLE:
     143             : 
     144             :         case SQL_CREATE_INDEX:
     145             :         case SQL_DROP_INDEX:
     146             : 
     147             :         case SQL_CREATE_USER:
     148             :         case SQL_DROP_USER:
     149             :         case SQL_ALTER_USER:
     150             : 
     151             :         case SQL_RENAME_COLUMN:
     152             :         case SQL_RENAME_SCHEMA:
     153             :         case SQL_RENAME_TABLE:
     154             :         case SQL_RENAME_USER:
     155             :         case SQL_SET_TABLE_SCHEMA:
     156             : 
     157             :         case SQL_CREATE_TYPE:
     158             :         case SQL_DROP_TYPE:
     159      219177 :                 return rel_schemas(query, s);
     160             : 
     161         406 :         case SQL_CREATE_SEQ:
     162             :         case SQL_ALTER_SEQ:
     163             :         case SQL_DROP_SEQ:
     164         406 :                 return rel_sequences(query, s);
     165             : 
     166      258734 :         case SQL_CREATE_FUNC:
     167             :         case SQL_DROP_FUNC:
     168             :         case SQL_DECLARE:
     169             :         case SQL_CALL:
     170             :         case SQL_SET:
     171             : 
     172             :         case SQL_CREATE_TABLE_LOADER:
     173             : 
     174             :         case SQL_CREATE_TRIGGER:
     175             :         case SQL_DROP_TRIGGER:
     176             : 
     177             :         case SQL_ANALYZE:
     178      258734 :                 return rel_psm(query, s);
     179             : 
     180      149770 :         case SQL_INSERT:
     181             :         case SQL_UPDATE:
     182             :         case SQL_DELETE:
     183             :         case SQL_TRUNCATE:
     184             :         case SQL_MERGE:
     185             :         case SQL_COPYFROM:
     186             :         case SQL_COPYINTO:
     187             :         case SQL_BINCOPYFROM:
     188             :         case SQL_BINCOPYINTO:
     189             :         case SQL_COPYLOADER:
     190      149770 :                 return rel_updates(query, s);
     191             : 
     192         296 :         case SQL_WITH:
     193         296 :                 return rel_with_query(query, s);
     194             : 
     195         182 :         case SQL_MULSTMT: {
     196         182 :                 dnode *d;
     197         182 :                 sql_rel *r = NULL;
     198             : 
     199         182 :                 if (!stack_push_frame(sql, "%MUL"))
     200           0 :                         return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
     201         558 :                 for (d = s->data.lval->h; d; d = d->next) {
     202         378 :                         symbol *sym = d->data.sym;
     203         378 :                         sql_rel *nr = rel_semantic(query, sym);
     204             : 
     205         378 :                         if (!nr) {
     206           2 :                                 stack_pop_frame(sql);
     207           2 :                                 return NULL;
     208             :                         }
     209         376 :                         if (r)
     210         194 :                                 r = rel_list(sql->sa, r, nr);
     211             :                         else
     212             :                                 r = nr;
     213             :                 }
     214         180 :                 stack_pop_frame(sql);
     215         180 :                 return r;
     216             :         }
     217           0 :         case SQL_PREP:
     218             :         {
     219           0 :                 dnode *d = s->data.lval->h;
     220           0 :                 symbol *sym = d->data.sym;
     221           0 :                 sql_rel *r = rel_semantic(query, sym);
     222             : 
     223           0 :                 if (!r)
     224             :                         return NULL;
     225             :                 return r;
     226             :         }
     227             : 
     228      158622 :         case SQL_SELECT:
     229             :         case SQL_JOIN:
     230             :         case SQL_UNION:
     231             :         case SQL_EXCEPT:
     232             :         case SQL_INTERSECT:
     233             :         case SQL_VALUES:
     234      158622 :                 return rel_selects(query, s);
     235             : 
     236           0 :         default:
     237           0 :                 return sql_error(sql, 02, SQLSTATE(42000) "Symbol type not found");
     238             :         }
     239             : }

Generated by: LCOV version 1.14