{"id":490,"date":"2018-06-04T21:56:27","date_gmt":"2018-06-04T19:56:27","guid":{"rendered":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/?page_id=490"},"modified":"2018-06-06T17:42:04","modified_gmt":"2018-06-06T15:42:04","slug":"sid-messier-catalogue-demo","status":"publish","type":"page","link":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/the-course\/sid-messier-catalogue-demo\/","title":{"rendered":"SID: Messier catalogue demo"},"content":{"rendered":"<p>In this code we make use of the Messier demo catalogue.<br \/>\nTSV files used: <a href=\"\/imprs-db\/Data\/messier.tsv\">messier.tsv<\/a> and <a href=\"\/imprs-db\/Data\/messier_legend.tsv\">messier_legend.tsv<\/a><br \/>\nTo execute these examples you should login as user &#8220;root&#8221; with:<br \/>\n<code>mysql --local-infile=1 -u root -p<\/code><br \/>\nand type the password when requested.<\/p>\n<p>In the following examples we will assume that SID has been properly installed. Remember that comment lines start with &#8212; or #, the query ends with a ; and you can split the query on several rows.<br \/>\nAlso note that functions can only return 1 value!<br \/>\nHere we use the <tt>SID<\/tt> database and login as <tt>root<\/tt>, but you can use any, e.g. <tt>mpe2018db<\/tt> and login as <tt>mpeusr<\/tt>:<\/p>\n<p>Just a check invoking a mysqsl query from the shell:<\/p>\n<pre>\r\nshell> mysql -u mpeusr -p -e \"select count(*) from messier\" mpe2018db\r\nEnter password: mpe2018pass\r\n+----------+\r\n| count(*) |\r\n+----------+\r\n|      110 |\r\n+----------+\r\nshell>\r\n<\/pre>\n<p>It looks good.<\/p>\n<pre>\r\nshell> mysql -u root -p\r\nEnter password: \r\n\r\n-- Use the \"SID\" database, but can use any, e.g. mpe2018db\r\nUSE SID;\r\n\r\n--\r\n-- Set geographic coordinate and time zone offset (Garching)\r\n--\r\n-- 48.2618996 , 11.6717692\r\n--\r\nSET @Long := 11.7;\r\nSET @Lat := 48.3;\r\nSET @TZ_offset := -1;\r\n\r\n--\r\n--  M1 (Crab Nebula) coordinates:  RA  = 5.575   (Hours)\r\n--                                 DEC = 22.0167 (Degrees);\r\n--\r\n-- To convert from Hours to Degrees simply multiply by 15.0\r\n--\r\nSET @Ra := 5.575 * 15.0;\r\nSET @Decl := 22.0167;\r\n\r\n--\r\n-- This variable will be used to perform circular selection\r\n--\r\n-- Radius in degrees\r\n--\r\nSET @Rad := 10;\r\n\r\n--\r\n-- From now on all angles will be in Degrees\r\n--\r\n\r\n-- Create the table that will contain the Messier catalog\r\nDROP TABLE IF EXISTS Messier;\r\nCREATE TABLE Messier (\r\n\tM int NOT NULL, \r\n\tType CHAR(2) DEFAULT '**',\r\n\tConst CHAR(3) DEFAULT '***', \r\n\tMag FLOAT, \r\n\tRa  FLOAT, \r\n\tDecl FLOAT, \r\n\tDist CHAR(20), \r\n\tApp_size CHAR(20) DEFAULT 'unknown', \r\n        PRIMARY KEY(M),\r\n        INDEX(Type)\r\n) engine=MyISAM;\r\n\r\nDESCRIBE Messier;\r\nSELECT * FROM Messier;\r\n\r\n\r\n-- Load data into the table\r\nLOAD DATA LOCAL INFILE '.\/messier.tsv'  \r\n  INTO TABLE Messier;\r\n\r\nSELECT * FROM Messier;  -- note the Ra column values\r\n\r\n-- Convert Ra from hours to degrees.\r\nUPDATE Messier SET Ra = Ra * 15.0;\r\nSELECT * FROM Messier;\r\n\r\n\r\n-- Create the table that will contain the description of each object type\r\nDROP TABLE IF EXISTS TypeDescr;\r\nCREATE TABLE TypeDescr(\r\n      Type CHAR(2), \r\n      Descr CHAR(20), \r\n      PRIMARY KEY(Type)\r\n);\r\nDESCRIBE TypeDescr;\r\n\r\n-- Load data into the table\r\nLOAD DATA LOCAL INFILE '.\/messier_legend.tsv'  \r\n  INTO TABLE TypeDescr;\r\n\r\nSELECT * FROM TypeDescr;\r\n\r\n\r\n\r\n-- A simple join to show the long description of each object type\r\nSELECT Messier.*, TypeDescr.Descr \r\nFROM Messier LEFT JOIN TypeDescr\r\nON Messier.Type = TypeDescr.Type;\r\n<\/pre>\n<p>From here we assume you have SID installed! See <a href=\"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/client-software\/installing-sid\/\">instructions<\/a>.<\/p>\n<pre>\r\n--\r\n-- Add a column and an index for the HTM id (depth 6) to the Messier table\r\n--\r\nALTER TABLE Messier ADD COLUMN htmID_6 SMALLINT UNSIGNED, ADD INDEX(htmID_6);\r\n\r\nDESCRIBE Messier;\r\nSHOW INDEX FROM Messier;\r\n\r\n-- Populate the new column with htmIDs\r\nUPDATE Messier SET htmID_6 = HTMLookup(6, Ra, Decl);\r\n\r\nSELECT * FROM Messier;  -- note the htmID_6 column values\r\n\r\n\r\n-- Use a demo SID function to query on a circular region (and view the result)\r\nselect @Ra, @Decl, @Rad;  -- check the these local variables are set\r\n\r\nCALL SID.SelectCircleHTM ('', '*', 'mpe2018db.Messier', 'htmID_6',  6, 'RA', 'Decl', @Ra, @Decl, @Rad, '');\r\n\r\n\r\n-- Same query on 100 times larger region but saving the result into a temporary table ('myregion')\r\nCALL SID.SelectCircleHTM ('myregion', '*', 'mpe2018db.Messier', 'htmID_6',  6, 'RA', 'Decl', @Ra, @Decl, @Rad*100, '');\r\n\r\n-- The temporary table goes into the SID database\r\nselect * from SID.myregion;\r\n\r\n-- Make a join with the TypeDescr table to get a description of these objects\r\nSELECT SID.myregion.*, TypeDescr.Descr\r\nFROM SID.myregion LEFT JOIN TypeDescr\r\nON SID.myregion.Type = TypeDescr.Type;\r\n\r\n-- perform more queries at your wish ...\r\n<\/pre>\n<p>Below more examples of use of the SID provided functions. With some experience you can build your own functions and procedures to make use of them to meet your needs.<br \/>\nLet&#8217;s first describe some of them:<\/p>\n<p><tt>HTMLookup(depth INT, Ra_deg DOUBLE, Dec_deg DOUBLE)<\/tt><\/p>\n<p>This UDF does a lookup of the htmID, at a given depth, of the pixel which contains the point with with coordinates <tt>Ra_deg<\/tt> and <tt>Dec_deg<\/tt>.<br \/>\n <strong>Returns<\/strong>:<br \/>\n  the HTM ID of the pixel at the requested depth.<\/p>\n<p><tt>HEALPLookup(is_nested INT, order INT, Ra_deg DOUBLE, Dec_deg DOUBLE)<\/tt><\/p>\n<p>This UDF does a lookup of the healpID, at a given order and schema, of the pixel which contains the point with with coordinates <tt>Ra_deg<\/tt> and <tt>Dec_deg<\/tt>.<br \/>\n <strong>Returns<\/strong>:<br \/>\n  the HEALPix ID of the pixel at the requested order and schema.<\/p>\n<p><tt>CreateCircle_HTM  (Ra_deg DOUBLE, Dec_deg DOUBLE, Rad_arcmin DOUBLE)<\/tt><br \/>\n<tt>CreateCircle_HEALP(Ra_deg DOUBLE, Dec_deg DOUBLE, Rad_arcmin DOUBLE)<\/tt><\/p>\n<p>These SQL procedures (placed in to the database <tt>SID<\/tt> !) generate HTM \/ HEALPix IDs for those pixel falling in or touching a circle centered at <tt>Ra_deg<\/tt> and <tt>Dec_deg<\/tt> (deg) with a radius of <tt>Rad_arcmin<\/tt> (arcmin) writing them into the TEMPORARY table <tt><strong>SID.sid<\/strong><\/tt>.<\/p>\n<p><tt>CreateRect_HTM  (Ra_deg DOUBLE, Dec_deg DOUBLE, SideRA_arcmin DOUBLE, SideDec_arcmin DOUBLE)<\/tt><br \/>\n<tt>CreateRect_HEALP(Ra_deg DOUBLE, Dec_deg DOUBLE, SideRA_arcmin DOUBLE, SideDec_arcmin DOUBLE)<\/tt><\/p>\n<p> Generate HTM \/ HEALPix IDs for those pixel falling in or touching a pseudo-rectangle centered at <tt>Ra_deg<\/tt> and <tt>Dec_deg<\/tt> (deg) with sides along RA and Dec of <tt>SideRA_arcmin<\/tt>, <tt>SideDec_arcmin<\/tt> (arcmin) writing them into the TEMPORARY table <tt><strong>SID.sid<\/strong><\/tt>.<\/p>\n<p>And now let&#8217;s use them:<\/p>\n<pre>\r\n-- Get the HTM depth 8 and HEALPix order 10 (nested schema) IDs for the first 10 objects\r\n-- in the Messier catalogue\r\nSELECT HTMLookup(8, ra, decl) AS HTMid8,\r\n       HEALPLookup(1, 10, ra, decl) AS HEALPid10\r\n  FROM Messier\r\n  WHERE m < 11;\r\n\r\n\r\n-- Get the distance from M1 of the following M2 to M5 objects\r\nselect ra, decl from Messier where M=1;\r\n-- will return 83.625, 22.0167\r\n\r\nSELECT sphedist(83.625, 22.0167, RA, Decl) AS sep_arcmin_from_M1 FROM Messier WHERE M > 1 AND M < 6;\r\n\r\n-- results are in arcmin. To get them in degrees:\r\nSELECT sphedist(83.625, 22.0167, RA, Decl)\/60 AS sep_deg_from_M1 FROM Messier WHERE M > 1 AND M < 6;\r\n\r\n\r\n-- Create the list of HTM depth 6 trixel IDs (size about 1.1 deg) for a region centered at\r\n-- coords (15, 20) and a radius of 100 arcmin\r\nCALL SID.CreateCircle_HTM(6, 15, 20, 100);\r\nSELECT * FROM SID.sid;\r\n\r\n-- you will see that only 2 trixels are fully covered by this region\r\n\r\n-- Do the same but using a region of 8 arcmin and using the HEALPix nested schema\r\n-- at order 10 (pixel size about 3.5 arcmin)\r\n\r\nCALL SID.CreateCircle_HEALP(10, 15, 20, 8);\r\nSELECT * FROM SID.sid;\r\n\r\n-- you will see more pixels, fully and partially covered by the region\r\n\r\n-- Now using a pseudo-square region (sides along RA and Dec)\r\n-- Note that we are passing the size of the 2 \"sides\"\r\n\r\nCALL SID.CreateRect_HTM(6, 15, 20, 100, 100);\r\nSELECT * FROM SID.sid;\r\n \r\nCALL SID.CreateRect_HEALP(10, 15, 20, 8, 8);\r\nSELECT * FROM SID.sid;\r\n<\/pre>\n<p>Below some examples of useful SQL functions and procedures:<\/p>\n<pre>\r\ndelimiter \/\/\r\n--\r\n-- Compute distance between two points on a sphere\r\n--\r\n--  Note that SID already has a function to calculate spherical distance: Sphedist\r\n--  This function is just for demonstration.\r\n--\r\n-- a1\/b1: long\/lat of first point (DEG)\r\n-- a2\/b2: long\/lat of second point (DEG)\r\n--\r\n-- Returns:\r\n--    distance in Degrees\r\n--\r\n\r\nDROP FUNCTION IF EXISTS skydist\/\/\r\nCREATE FUNCTION skydist(a1 DOUBLE, b1 DOUBLE, a2 DOUBLE, b2 DOUBLE) RETURNS DOUBLE\r\nBEGIN\r\n  DECLARE deg2rad, a1r, b1r, a2r, b2r, radiff, cosdis, dist DOUBLE;\r\n\r\n  SET deg2rad = 0.017453292519943;\r\n  SET a1r = a1*deg2rad;\r\n  SET b1r = b1*deg2rad;\r\n  SET a2r = a2*deg2rad;\r\n  SET b2r = b2*deg2rad;\r\n  SET radiff = ABS(a2r-a1r);\r\n  IF (radiff > pi()) THEN\r\n    SET radiff = pi() * 2e0 - radiff;\r\n  END IF;\r\n  SET cosdis = sin(b1r)*sin(b2r) + cos(b1r)*cos(b2r)*cos(radiff);\r\n  SET dist = acos(cosdis)\/deg2rad;\r\n\r\n  RETURN dist;\r\nEND\/\/\r\n\r\n\r\n-- From year, month, day, hour to Julian day\r\nDROP FUNCTION IF EXISTS jdcnv\/\/\r\nCREATE FUNCTION jdcnv(yr INT, mn INT, day INT, hr DOUBLE) RETURNS DOUBLE\r\nBEGIN\r\n  DECLARE L DOUBLE;\r\n  DECLARE j BIGINT;\r\n  DECLARE julian DOUBLE;\r\n\r\n  SET L = (mn-14) DIV 12;\r\n  SET j = day - 32075 + 1461*(yr+4800+L) DIV 4 + \r\n               367*(mn - 2-L*12) DIV 12 - 3*((yr+4900+L) DIV 100) DIV 4;\r\n\r\n  SET julian = j + hr\/24.0 -0.5;\r\n  RETURN julian;\r\nEND\/\/\r\n\r\n\r\n-- From hour angle and declination to Alt, Az coordinates\r\nDROP PROCEDURE IF EXISTS hadec2altaz\/\/\r\nCREATE PROCEDURE hadec2altaz(IN ha DOUBLE, IN decl DOUBLE, IN lat DOUBLE, \r\n                             OUT alt DOUBLE, OUT az DOUBLE)\r\nBEGIN\r\n  DECLARE d2r, sh, ch, sd, cd, sl, cl DOUBLE;\r\n  DECLARE x, y, z, r DOUBLE;\r\n\r\n  SET d2r = pi()\/180.0;\r\n  \r\n  SET sh = sin(ha*d2r);\r\n  SET ch = cos(ha*d2r);\r\n  SET sd = sin(decl*d2r);\r\n  SET cd = cos(decl*d2r);\r\n  SET sl = sin(lat*d2r);\r\n  SET cl = cos(lat*d2r);\r\n\r\n  SET x = - ch * cd * sl + sd * cl;\r\n  SET y = - sh * cd;\r\n  SET z = ch * cd * cl + sd * sl;\r\n  SET r = sqrt(x*x + y*y);\r\n  \r\n  SET az = atan(y,x) \/ d2r;\r\n  SET alt = atan(z,r) \/ d2r;\r\n\r\n  IF (az < 0) THEN\r\n    SET az = az + 360;\r\n  END IF;\r\nEND\/\/\r\n\r\n\r\n-- From hour angle and declination to Altitude\r\nDROP FUNCTION IF EXISTS hadec2alt\/\/\r\nCREATE FUNCTION hadec2alt(ha DOUBLE, decl DOUBLE, lat DOUBLE) RETURNS DOUBLE\r\nDETERMINISTIC\r\nBEGIN\r\n  DECLARE alt, az DOUBLE;\r\n  CALL hadec2altaz(ha, decl, lat, alt, az);\r\n\r\n  RETURN alt;\r\nEND\/\/\r\n\r\n\r\n-- From hour angle and declination to Azimuth\r\nDROP FUNCTION IF EXISTS hadec2az\/\/\r\nCREATE FUNCTION hadec2az(ha DOUBLE, decl DOUBLE, lat DOUBLE) RETURNS DOUBLE\r\nDETERMINISTIC\r\nBEGIN\r\n  DECLARE alt, az DOUBLE;\r\n  CALL hadec2altaz(ha, decl, lat, alt, az);\r\n\r\n  RETURN az;\r\nEND\/\/\r\n\r\n\r\n-- From Julian day to local sidereal time\r\nDROP FUNCTION IF EXISTS jd2st\/\/\r\nCREATE FUNCTION jd2st(jd DOUBLE, lng DOUBLE) RETURNS DOUBLE\r\nDETERMINISTIC\r\nBEGIN\r\n  DECLARE c0, c1, c2, c3 DOUBLE;\r\n  DECLARE jd2000, lst DOUBLE;\r\n  DECLARE t, t0, theta DOUBLE;\r\n\r\n  SET c0 = 280.46061837;\r\n  SET c1 = 360.98564736629;\r\n  SET c2 = 0.000387933;\r\n  SET c3 = 38710000.0;\r\n \r\n  SET jd2000 = 2451545.0;\r\n\r\n  SET t0 = jd - jd2000;\r\n  SET t = t0\/36525.0;\r\n  \r\n  SET theta = c0 + (c1 * t0) + t*t*(c2 - t \/ c3 );\r\n  \r\n  SET lst = (theta + lng)\/15.0;\r\n\r\n  IF (lst < 0) THEN\r\n    SET lst = 24.0 + (lst % 24.0);\r\n  END IF;\r\n  SET lst = lst % 24.0;\r\n\r\n  RETURN lst;\r\nEND\/\/\r\n\r\n\r\n-- From local DATETIME and Time zone to Julian day\r\nDROP FUNCTION IF EXISTS Julian\/\/\r\nCREATE FUNCTION Julian(Time DATETIME, TZ_offset INT) RETURNS DOUBLE\r\nDETERMINISTIC\r\nBEGIN\r\n  DECLARE Yr, Mn, Dy, Hr, Mi, Se INT;\r\n  DECLARE Hr_fr, jd DOUBLE;\r\n\r\n  SET Yr = year(Time);\r\n  SET Mn = month(Time);\r\n  SET Dy = day(Time);\r\n  SET Hr = hour(Time);\r\n  SET Mi = minute(Time);\r\n  SET Se = second(Time);\r\n  SET Hr_fr =(Hr+TZ_offset) + Mi\/60.0 + Se\/3600.0;\r\n  \r\n  SET jd = jdcnv(Yr, Mn, Dy, Hr_fr);\r\n  RETURN jd;\r\nEND\/\/\r\n\r\n\r\n-- From local DATETIME and Time zone to local sidereal time\r\nDROP FUNCTION IF EXISTS Sidereal\/\/\r\nCREATE FUNCTION Sidereal(Time DATETIME, TZ_offset INT, Lng DOUBLE) RETURNS DOUBLE\r\nDETERMINISTIC\r\nBEGIN\r\n  DECLARE jd, st DOUBLE;\r\n\r\n  SET jd = Julian(Time, TZ_offset);\r\n  SET st = jd2st(jd, Lng);\r\n  RETURN st;\r\nEND\/\/\r\n\r\n\r\n-- From equatorial Ra, Dec to Altitude\r\nDROP FUNCTION IF EXISTS radec2alt\/\/\r\nCREATE FUNCTION radec2alt(Ra DOUBLE, Decl DOUBLE, Lat DOUBLE, Lng DOUBLE, \r\n                          TZ_offset INT, Time DATETIME)\r\nRETURNS DOUBLE\r\nBEGIN\r\n  DECLARE st, ha, alt DOUBLE;\r\n\r\n  SET st = Sidereal(Time, TZ_offset, Lng) * 15.0;\r\n  SET ha = st - Ra;\r\n  SET alt = hadec2alt(ha, Decl, Lat);\r\n  RETURN alt;\r\nEND\/\/\r\n\r\n\r\n-- From equatorial Ra, Dec to Azimuth\r\nDROP FUNCTION IF EXISTS radec2az\/\/\r\nCREATE FUNCTION radec2az(Ra DOUBLE, Decl DOUBLE, Lat DOUBLE, Lng DOUBLE, \r\n                         TZ_offset INT, Time DATETIME)\r\nRETURNS DOUBLE\r\nBEGIN\r\n  DECLARE st, ha, az DOUBLE;\r\n\r\n  SET st = Sidereal(Time, TZ_offset, Lng) * 15.0;\r\n  SET ha = st - Ra;\r\n  SET az = hadec2az(ha, Decl, Lat);\r\n  RETURN az;\r\nEND\/\/\r\n\r\n-- back to the default demimiter\r\ndelimiter ;\r\n\r\n-- Use skydist\r\n\r\nSELECT skydist(170.2, 32.4, 171, 33) AS dist_deg;\r\n+-------------------+\r\n| dist_deg          |\r\n+-------------------+\r\n| 0.901775161467635 |\r\n+-------------------+\r\n\r\nSELECT skydist(Ra, Decl, 83, 22)*60 AS dist_arcmin\r\n  FROM Messier WHERE M=1;\r\n+-------------------+\r\n| dist_arcmin       |\r\n+-------------------+\r\n| 34.78175964005546 |\r\n+-------------------+\r\n\r\n\r\n--\r\n-- Example of usage of jdcnv and jd2st\r\n--\r\nSELECT  @Time:= now() AS Time, \r\n\t@Yr:=year(@Time) AS Year, \r\n\t@Mn:=month(@Time) AS Month, \r\n\t@Dy:=day(@Time) AS Day,\r\n\t@Hr:=hour(@Time) AS Hour,\r\n\t@Mi:=minute(@Time) AS Minute,\r\n\t@Se:=second(@Time) AS Second,\r\n\t@Hr_fr:=(@Hr+@TZ_offset) + @Mi\/60.0 + @Se\/3600.0 AS Hr_fr,\r\n\t@Jd:=jdcnv(@Yr, @Mn, @Dy, @Hr_fr) AS Julian,\r\n\t@Si:=jd2st(@Jd, @Long) AS Sidereal;\r\n\r\n-- Do the same with\r\nSELECT Julian(now(), @TZ_offset), Sidereal(now(), @TZ_offset, @Long);\r\n\r\n--\r\n-- Example of usage of hadec2alt, hadec2az\r\n-- (coordinate conversion from Ra\/Dec to Alt\/Az)\r\n--\r\n-- Compute sidereal time and convert to Degrees\r\n--\r\nSET @Si := Sidereal(now(), @TZ_offset, @Long) * 15.0;\r\n\r\n--\r\n-- Compute hour angle\r\n--\r\nSET @Hour_angle := @Si - @Ra;\r\n\r\nSELECT @Ra, @Decl, @Hour_angle, \r\n       hadec2alt(@Hour_angle, @Decl, @Lat) AS Alt, \r\n       hadec2az( @Hour_angle, @Decl, @Lat) AS Az;\r\n\r\n-- Do the same with\r\nSELECT @Ra, @Decl, @Hour_angle,\r\n       radec2alt(@Ra, @Decl, @Lat, @Long, @TZ_offset, now()) AS Alt,\r\n       radec2az( @Ra, @Decl, @Lat, @Long, @TZ_offset, now()) AS Az;\r\n\r\n\r\n--\r\n-- Note: variables (like @Lat, @Long, @TZ_offset) cannot be used inside\r\n-- views.\r\n--\r\nDROP VIEW IF EXISTS Messier_view;\r\nCREATE VIEW Messier_view AS\r\n  SELECT Messier.M, \r\n         TypeDescr.Descr AS Descr,\r\n         Messier.Const,\r\n         Messier.Mag,\r\n         Messier.Ra,\r\n         Messier.Decl,\r\n         radec2alt(Messier.Ra, Messier.Decl, 38, 13, -1, now()) AS Alt,\r\n         radec2az( Messier.Ra, Messier.Decl, 38, 13, -1, now()) AS Az,\r\n         Messier.Dist,\r\n         Messier.App_size\r\n  FROM Messier LEFT JOIN TypeDescr\r\n  ON Messier.Type = TypeDescr.Type\r\n  ORDER BY Descr, M;\r\n\r\nDESCRIBE Messier_view;\r\nSELECT * FROM Messier_view;\r\n\r\n\r\n-- *******************************************************************\r\n\r\n\r\n\r\n--\r\n-- Set up a trigger to automatically update the htmID_6 field (use the name you have)\r\n-- when a new record is inserted\r\n--\r\n\r\nshow triggers;\r\n\r\n-- eventually\r\ndrop trigger trig_ins_Messier;\r\n\r\ndelimiter \/\/\r\nDROP TRIGGER trig_ins_Messier\/\/\r\nCREATE TRIGGER trig_ins_Messier BEFORE INSERT ON Messier FOR EACH ROW\r\nBEGIN\r\n  SET NEW.htmID_6 = HTMLookup(6, NEW.Ra, NEW.Decl);\r\nEND\/\/\r\n\r\n--\r\n-- Do the same for updated records\r\n--\r\nDROP TRIGGER trig_upd_Messier\/\/\r\nCREATE TRIGGER trig_upd_Messier BEFORE UPDATE ON Messier FOR EACH ROW\r\nBEGIN\r\n  SET NEW.htmID_6 = HTMLookup(6, NEW.Ra, NEW.Decl);\r\nEND\/\/\r\ndelimiter ;\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>In this code we make use of the Messier demo catalogue. TSV files used: messier.tsv and messier_legend.tsv To execute these examples you [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":16,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-490","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/wp-json\/wp\/v2\/pages\/490"}],"collection":[{"href":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/wp-json\/wp\/v2\/comments?post=490"}],"version-history":[{"count":8,"href":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/wp-json\/wp\/v2\/pages\/490\/revisions"}],"predecessor-version":[{"id":547,"href":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/wp-json\/wp\/v2\/pages\/490\/revisions\/547"}],"up":[{"embeddable":true,"href":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/wp-json\/wp\/v2\/pages\/16"}],"wp:attachment":[{"href":"https:\/\/ross2.oas.inaf.it\/wp\/imprs18\/wp-json\/wp\/v2\/media?parent=490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}