sql >> Databasteknik >  >> RDS >> Mysql

SQL-skript - Finns motsvarigheten till en #define?

C Pre Processor (cpp) är historiskt förknippad med C (därav namnet), men det är verkligen en generisk textprocessor som kan användas (eller missbrukas) för något annat.

Tänk på den här filen, som heter location.src (mer om det senare).

// C++ style comments works here
/* C style works also */
-- plain old SQL comments also work,
-- but you should avoid using '#' style of comments,
-- this will confuse the C pre-processor ...

#define LOCATION_LEN 25

/* Debug helper macro */
#include "debug.src"

DROP TABLE IF EXISTS test.locations;
CREATE TABLE test.locations
(
   `location` VARCHAR(LOCATION_LEN) NOT NULL
);

DROP PROCEDURE IF EXISTS test.AddLocation;
delimiter $$
CREATE PROCEDURE test.AddLocation (IN location VARCHAR(LOCATION_LEN))
BEGIN
  -- example of macro
  ASSERT(length(location) > 0, "lost or something ?");

  -- do something
  select "Hi there.";
END
$$

delimiter ;

och filen debug.src, som ingår:

#ifdef HAVE_DEBUG
#define ASSERT(C, T)                                          \
  begin                                                       \
    if (not (C)) then                                         \
      begin                                                   \
        declare my_msg varchar(1000);                         \
        set my_msg = concat("Assert failed, file:", __FILE__, \
                            ", line: ", __LINE__,             \
                            ", condition ", #C,               \
                            ", text: ", T);                   \
        signal sqlstate "HY000" set message_text = my_msg;    \
     end;                                                     \
    end if;                                                   \
  end
#else
#define ASSERT(C, T) begin end
#endif

När den kompileras med:

cpp -E location.src -o location.sql

du får koden du letar efter, med cpp expanderande #define values.

När den kompileras med:

cpp -E -DHAVE_DEBUG location.src -o location.sql

du får samma, plus ASSERT-makrot (läggs upp som en bonus, för att visa vad kan göras).

Om man antar att ett bygge med HAVE_DEBUG installerat i en testmiljö (i 5.5 eller senare sedan SIGNAL används), ser resultatet ut så här:

mysql> call AddLocation("Here");
+-----------+
| Hi there. |
+-----------+
| Hi there. |
+-----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call AddLocation("");
ERROR 1644 (HY000): Assert failed, file:location.src, line: 24, condition length(location) > 0, text: lost or something ?

Notera hur filnamnet, radnumret och villkoret pekar precis på platsen i källkoden i location.src där bekräftelsen höjs, tack än en gång till C-förbehandlaren.

Nu om filtillägget ".src":

  • du kan använda vad som helst.
  • Att ha ett annat filtillägg hjälper till med make-filer, etc, och förhindrar förvirring.

EDIT:Ursprungligen postat som .xql, bytt namn till .src för tydlighetens skull. Inget relaterat till xml-frågor här.

Som med alla verktyg kan användning av cpp leda till bra saker, och användningsfallet för att underhålla LOCATION_LEN på ett portabelt sätt ser mycket rimligt ut. Det kan också leda till dåliga saker, med för många #include, kapslade #ifdef helvete, makron, etc. som i slutet fördunklar koden, så din körsträcka kan variera.

Med det här svaret får du hela grejen (#define , #include , #ifdef , __FILE__ , __LINE__ , #C , kommandoradsalternativ att bygga), så jag hoppas att det ska täcka allt.



  1. Laravel vältalig Ignorera hölje

  2. Skapa en tabell med mysql, php och ajax (med jquery)

  3. Lätt inköpsäventyr

  4. Loopar svg-rektanglar från databasen