Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Другие СУБД Новый топик    Ответить
 Мерзопакость HyTech и JOIN'ы  [new]
NetFantom
Member

Откуда: Санкт-Петербург
Сообщений: 273
Столкнулся с этим выкидышем отечественного производства, и сразу огреб кучу проблем. Таких разработчиков нужно сортиры чистить отправлять, а тех взяточников что внедрял этот недопродукт в ГОС компаниях (ну 100% там деньги просто на этом дерьме наваривали) нужно к стенке ставить.
Простой пример:

close table A1;
close table A2;
drop table A1;
create table A1(
       id    int key,
       str   char(10)
);
drop table A2;
create table A2(
       id    int key,
       str   char(10)
);

insert into A1 values(1,'A1-1');
insert into A1 values(2,'A1-2');
insert into A1 values(6,'A1-6');

insert into A2 values(1,'A2-1');
insert into A2 values(2,'A2-2');
insert into A2 values(3,'A2-3');
insert into A2 values(4,'A2-4');

а теперь выполним
select * from A1,A2
where A1.id *= A2.id;

вы думаете это просто INNER JOIN? Да хрен там, обломитесь. Это всегда что-то типа LEFT JOIN. И результсет зависит от порядка перечисления таблиц! А в документации сказано, что левое и правое объединение делаются с помощью "*=" и "=*".
Кто-нибудь сталкивался с этим монстром? Можно тут что-то сделать?
25 мар 10, 13:33    [8531590]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
NetFantom
Member

Откуда: Санкт-Петербург
Сообщений: 273
NetFantom,

Сори, в предыдущем посте ошибка, выполняемый код именно:
select * from A1,A2
where A1.id = A2.id;
25 мар 10, 13:36    [8531619]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29299

Hello, NetFantom!
You wrote on Thu, 25 Mar 10 10:36:25 GMT:

NetFantom
N> Сори, в предыдущем посте ошибка, выполняемый код именно:
N> select * from A1,A2
N> where A1.id = A2.id;
круто.
а явные INNER JOIN и LEFT/RIGHT OUTER JOIN оно понимает?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4

25 мар 10, 13:38    [8531638]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
NetFantom
Member

Откуда: Санкт-Петербург
Сообщений: 273
Нет, такого синтаксиса вообще нет.
Я вообще молчу про то что имеется встроенный компилятор-декомпилятор хранимых процедур, который при декомпиляции "теряет" ковычки и (самое главное!) скобки. Т.е. скомпиляв
var a;
var b;
var c;
....
@a = ((@b = @c) <=0);
вы получите при декомпиляции
@a = (@b = @c <= 0);
при это в документации:
Приоритет операции присваивания ниже приоритета всех операций отношения
зашибись просто...
25 мар 10, 13:46    [8531707]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 5976
NetFantom,

1. Хайтеч конечно г-но (да и написано на трубопаскале), но она создавалась когда конкурентами были FoxPro и Clipper. Не надо мерять сегодняшними мерками.
2.SQL для нее - совсем неродной интерфейс. Лучше и не пытайтесь. И без него глюков море. ->
3. Линкуйте напрямую ее либки (под древний компилятор) и используйте ее родной навигационный доступ.

Мог приврать, лет 15 прошло. Но если припрет, по моему архивах что то валялось.
25 мар 10, 13:58    [8531845]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 5976
Предотвращая подобные вопросы
Мимопроходящий
Привет, Plisteron!
Ты пишешь:
Plisteron
[Sorry, skipped]
P> После прочтения возник вопрос, который я адресую знатокам HyTech

это мифические существа.
хотя, допускаю, что коллега ЧАЛ, таки видел живьём,
представителей этой гипотетической (негуманоидной) цивилизации...

--
With best regards, Мимопроходящий.


Я не ЧАЛ )))
25 мар 10, 14:00    [8531882]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29299

Hello, Siemargl!
You wrote on Thu, 25 Mar 10 11:00:23 GMT:

Siemargl
S> Я не ЧАЛ )))
а сразу так и не отличишь...

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4

25 мар 10, 14:16    [8532039]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
NetFantom
Member

Откуда: Санкт-Петербург
Сообщений: 273
Siemargl,

HyTech начинал создавался в 94-95 году (по заявлениям разработчиков), когда уже были и Oracle и MSSQL. А если брать бесплатные то PostgreSQL и релиз MySQL в 95, так что не надо петь песни что это была "альтернатива". Это, скорее всего, было несколько талантливых математиков-программистов, которые заложили основы, а вот дальше над этим гиблым проектом трудились студенты-недоучки.
И как ему SQL-то не родным? =)) Роднее некуда. Я конечно не видел либы о которых вы говорите, но предполагаю что манипуляция данными все-равно на SQL диалекте ведется.
Да и не в этом дело - что же мне делать, если нужно сделать выборку в хранимой процедуре?
25 мар 10, 14:24    [8532111]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 5976
NetFantom
Siemargl,

HyTech начинал создавался в 94-95 году (по заявлениям разработчиков), когда уже были и Oracle и MSSQL. А если брать бесплатные то PostgreSQL и релиз MySQL в 95, так что не надо петь песни что это была "альтернатива". Это, скорее всего, было несколько талантливых математиков-программистов, которые заложили основы, а вот дальше над этим гиблым проектом трудились студенты-недоучки.
И как ему SQL-то не родным? =)) Роднее некуда. Я конечно не видел либы о которых вы говорите, но предполагаю что манипуляция данными все-равно на SQL диалекте ведется.
Да и не в этом дело - что же мне делать, если нужно сделать выборку в хранимой процедуре?

Были, да не у нас. Жуткая экзотика была вообще сервер в перестройку, а уже тем более сервер БД (MSSQL тем более на чем, на Win3.11????)
PG и MY вообще относительно недавно стали юзабельными.

Когда я с HT работал, SQL там не видел в принципе. Скорее всего, дописали позже.

У Вас шансов нет. Только танцы вприсядку, летопись багов итп
Если одна процедура - еще ничего, а вот программу писать, это да...
25 мар 10, 14:33    [8532207]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 5976
Нашел в архивах ядро Hitech1.5. Дата октябрь 1991г.
25 мар 10, 14:37    [8532249]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 5976
Вот интерфейс. Все три раза Ку.

+
#ifndef HYTECH_DEF
#define HYTECH_DEF
#ifdef __cplusplus
#include <mem.h>
extern "C"{
#endif
/* Вектор для HyTech задан как 123 (7Bh)                    */
/* Может быть изменен в переменной hytech_vector, но должен */
/* соответствовать параметру 'v' при загрузке ядра          */
extern	hytech_vector;

/* Блок Доступа к Результатам поиска (для функций Get...() ) */
struct	RESULT {
  void     far *buf;       /* Адpес буфеpа для чтения */
  unsigned buflen;         /* Длина буфеpа для чтения */
  unsigned rlen;           /* Число считанных байтов результатов */
  long     number;         /* Номер записи */
  char     reserve1[7];    /* Зарезервировано для системных целей */
  long     pos;            /* Позиция для перемещения указателя */
  char     reserve2[24];   /* Зарезервировано для системных целей */
};

/* Новый тип - Блок Доступа к Результатам */
typedef	struct RESULT RAB;

struct  BCB {
#ifdef __cplusplus
  BCB(){ ::setmem(this,sizeof(BCB),0); }
#endif

  int    Operation;           /* Код опеpации             */
  int    RetCode;             /* Код возвpата             */
  int    SubSchema;           /* Обработчик подсхемы      */
  int    KeyNumber;           /* Номеp ключа              */
  void   far *Value1;         /* Адрес пеpвого поpогового значения ключа */
  void   far *Value2;         /* Адрес втоpого поpогового значения ключа */
  struct BCB far *Chain;      /* Указатель на следующий БДС в  цепочке   */
  long   ItemFound;           /* Число найденных записей  */
  struct RESULT far *Result;  /* Адрес Блока Доступа к Результатам поиска*/
  char   Reserved[27];        /* Зарезервировано для системных целей     */
  long   TimeMark;            /* Временная отметка                       */
};

/* Новый тип - Блок Доступа к Сервису СУБД */
typedef	struct BCB SAB;	

/*            Описатель поля записи в подсхеме              */
/* Адрес массива таких описателей содержится в поле Field   */
/* структуры SUBSCHEMA, указатель на которую можно получить */
/* при помощи функции SubSchemaInfo() */
struct	FIELD {
  char     type;		/* Тип поля (см. #define FLD_???) */
  unsigned len;			/* Длина поля    */
  unsigned ofs;			/* Смещение поля */
  int   number;                 /* Номер поля среди ключевых */
};

/* Константы, используемые для работы с полем type структуры FIELD */

#define	FLD_MSK	0xC0			/* Маска для вырезания признаков поля */
#define	FLD_DAT	0x00			/* Поле данных */
#define	FLD_KEY	0x40			/* Поле ключевое */
#define	FLD_UNC	0x80			/* Поле уникальное */

#define	FLD_TYP 0x3F			/* Маска для вырезания типа поля */
#define	FLD_ASC	0x00			/* Поле - массив символов ASCII */
#define	FLD_BYT	0x01			/* Поле - короткое целое (байт) */
#define	FLD_INT	0x02			/* Поле - целое со знаком */
#define	FLD_LNG	0x03			/* Поле - длинное целое */
#define	FLD_FLT	0x04			/* Поле - действительное */
#define	FLD_DUB	0x05			/* Поле - длинное действительное */

/* Описание подсхемы (длинный указатель на нее */
/*   возвращается функцией SubSchemaInfo() )   */
struct	SUBSCHEMA {
  long     BaseRec;               /* Число записей в подсхеме */
  unsigned RecordLen;             /* Длина записи в подсхеме  */
  int      Fields;                /* Число полей в подсхеме   */
  int      Keys;                  /* Число ключей в подсхеме  */
  char     Name[9];               /* Общий префикс имен файлов подсхемы   */
  char     Path[51];              /* Путь на файлы подсхемы   */
  struct   FIELD far *Field;      /* Указатель на описание полей подсхемы */
  char     Reserved[29];          /* Зарезервировано для системных целей  */
};


/* Функции работы с подсхемами */

int  SubSchemaOpen ( SAB *B, char * SubSchemaName, int Mode );
int  SubSchemaClose(int SubSchemaNum );
int  AllSubSchemasClose( void );
struct SUBSCHEMA far * SubSchemaInfo( int SubSchemaNum );

/* Константы, используемые как третий аргумент функции SubSchemaOpen() */
#define	S_PRIVATE 0     /* Подсхема используется в монопольном режиме */
#define S_SHARE   1     /* Подсхема используется в совместном режиме */



/* Редактирование записей БД */

int  RecordAdd   ( SAB *Block, int SubSchema, void *Record );
int  RecordDelete( SAB *Block, int SubSchema, long RecordNo );
int  RecordEdit  ( SAB *Block, int SubSchema, long RecordNo, void *Record );


/* Функции работы с результатами поиска */

int  GetOpen       ( SAB *Block, struct RESULT * Access );
int  GetNumbersRead( SAB *Block, void *ReadBuf, unsigned BufLen );
int  GetRead       ( SAB *Block, void *ReadBuf, unsigned BufLen );
long GetSeek       ( SAB *Block, long Pos, int Mode );
int  GetItemDelete ( SAB *Block, long ItemNo );
int  GetClose      ( SAB *Block );
int  GetPhysRecord ( SAB *Block, int SubSchema, long *RecordNumber, void *ReadBuf, unsigned BufLen );
int  SortRecords   ( SAB *Block, SAB *Result, int KeyNumber, int Order );

/* Константы, используемые как третий аргумент функции GetSeek() */
#define S_SEEK_CUR	1       /* От текущей позиции */	
#define S_SEEK_END	2       /* От конца */
#define S_SEEK_SET	0       /* От начала */

/* Константы, используемые как четвертый аргумент функции SortRecords() */
#define SORT_ASC	1	/* В порядке возрастания */
#define SORT_DSC	0	/* В порядке убывания */

/* Функции поиска по одному ключу */

SAB  * KeyEqual      (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyGreat      (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyLess       (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyGreatEqual (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyLessEqual  (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyInside     (SAB *B, int SubSchema, int KeyNumber, void *Value1, void *Value2);
SAB  * KeyMinimum    (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyMaximum    (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyNotEqual   (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyNotGreat   (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyNotLess    (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyOutside    (SAB *B, int SubSchema, int KeyNumber, void *Value1, void *Value2);
SAB  * KeyNotMinimum (SAB *B, int SubSchema, int KeyNumber, void *Value);
SAB  * KeyNotMaximum (SAB *B, int SubSchema, int KeyNumber, void *Value);


/* Функции вертикального поска */

SAB  * AllKeyValues      (SAB *B, int SubSchema, int KeyNumber);
SAB  * ValuesByCondition (SAB *B, int KeyNumber, SAB *Cond);
SAB  * Implication       (SAB *B, int SubSchema, int KeyNumber, SAB *Cond, SAB *List);


/* Функции логических отношений для результатов поиска */

SAB  * NotResults (SAB *Block, SAB *Result);
SAB  * AndResults (SAB *Block, SAB *Result1, SAB *Result2);
SAB  * OrResults  (SAB *Block, SAB *Result1, SAB *Result2);


/* Функции специального поиска */

SAB  * MaxKeyValueInResult (SAB *B, int KeyNumber, void *Value, SAB *Res);
SAB  * MinKeyValueInResult (SAB *B, int KeyNumber, void *Value, SAB *Res);
SAB  * RecordsByKeyValues  (SAB *B, int SubSchema, int KeyNumber, SAB *List );
long   KeyHistogram        (SAB *B, int SubSchema, int KeyNumber);
long   ResultHistogram     (SAB *B, int KeyNumber, SAB *Res);


/* Прочие функции */

int    HyTech( SAB *Block );     /* Прямой вызов ядра */
int    HyTechBreak( void );      /* Прерывание текущей операции ядра */

int    ClearResults  ( SAB *Result );      /* Убить результаты для БДС */
int    TouchTimeMark ( SAB *Result );      /* Приведение временной метки */

int    ResultType( SAB *Result );     /* Определение типа результата */

/* Константы, описывающие коды возврата функции ResultType() */
#define RES_NPROC  -1   /* БДС не обработан, или результаты удалены */
#define RES_HORIS   0   /* БДС содержит результаты горизонтального поиска */
#define RES_VERT    1   /* БДС содержит результаты вертикального поиска */
#define RES_HISTO   2   /* БДС содержит гистограмму */
#define RES_SORTED  3   /* БДС содержит отсортированные результаты горизонтального поиска  */

char far *ExtError( int *DosError, int *Operation );/* Получить информацию об ошибке В/В */
char far *TmpPath( void );			/* Каталог для временных файлов */
char *Version( char *Buffer15 );		/* Номер версии СУБД */

#ifdef __cplusplus
}
#endif

#endif
25 мар 10, 14:39    [8532264]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
Simonik
Member

Откуда:
Сообщений: 27
NetFantom,
Это всегда что-то типа LEFT JOIN. И результсет зависит от порядка перечисления таблиц!
Отключи relation(1). Это специфический режим, который используется в особых случаях.
31 мар 10, 16:06    [8560160]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
axlm
Member

Откуда:
Сообщений: 39
Найн, мерзопакость это дельфёвые кодеры которые к ней клиентов пишут и основ сиквеля не знают, и метадологи которые не владеют своей предметной областью, а дбмэска очень стройная. Вполне годится для средних баз данных, бесплатна но виндовая и код закрыт. Так-что напрасно вы так хаите.
13 июл 10, 00:17    [9092047]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
NetFantom
Member

Откуда: Санкт-Петербург
Сообщений: 273
axlm,

Вы один из разработчиков этой пакости, судя по всему. Потому что никто кроме разработчиков этой СУБД, да еще тех кто материально был заинтересован при протаскивании этого устаревшего хлама в гос контракты, слова доброго не услышишь.

Когда-то видимо это была не плохая задумка, начатая талантливыми программистами. На больше чем за пару десятков лет эта СУБД так и не вышла в продакшн, и место ей в песочнице.
Автомобиль Запорожец тоже в свое время. Но вот современные дети увидев его покрутят пальцем у виска или спросят "сам сделал?".Так же и с этим чудом, место ему в истории.
9 авг 10, 13:41    [9234287]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
FSS
Member

Откуда: Калининград
Сообщений: 3
а я хочу защитить HYTech. Для относительно небольших баз данных (порядка 20 Гб) отличная вещь!!! Зная основы SQL, достаточно быстро поняла "сложности" написания скриптов. Насчет JOIN, может пригодится:

1. Обычный join, или join по полной паре (=). Например, запрос

select a.field1, b.field2 from tab1 a, tab2 b
where a.field1 = b.field2;

выберет из таблиц tab1 и tab2 только те записи, у которых совпадают значения в полях field1 и field2 соответственно, и соединит их.

2. join по неполной паре (*=, =*, **).

2.1. Запрос

select a.field1, b.field2 from tab1 a, tab2 b
where a.field1 *= b.field2;

выберет из таблицы tab2 все записи и присоединит к ним те записи из tab1, у которых совпадают значения в полях field2 и field1 соответственно. В результате у тех записей из tab2, для которых не нашлось соответствий в tab1, присоединенные поля из tab1 будут пустые.

2.2. Запрос

select a.field1, b.field2 from tab1 a, tab2 b
where a.field1 =* b.field2;

выберет из таблицы tab1 все записи и присоединит к ним те записи из tab2, у которых совпадают значения в полях field1 и field2 соответственно. В результате у тех записей из tab1, для которых не нашлось соответствий в tab2, присоединенные поля из tab2 будут пустые.

2.3. Запрос

select a.field1, b.field2 from tab1 a, tab2 b
where a.field1 ** b.field2;

выберет все записи из таблиц tab1 и tab2 и попытается соединить их по полям field1 и field2 соответственно. У тех записей из tab1, для которых не нашлось соответствий в tab2, присоединенные поля из tab2 будут пустые; и наоборот соответственно - у тех записей из tab2, для которых не нашлось соответствий в tab1, присоединенные поля из tab1 будут пустые.

******
Так что все понятно!
17 авг 10, 18:36    [9278274]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
NetFantom
Member

Откуда: Санкт-Петербург
Сообщений: 273
FSS,

Ага, а если сюда запостить документацию по PostgreSQL или MySQL? =)
Вообщем HyTech это
1. Старье
2. Не продакшн. Куча багов, в т.ч. связанных с целостностью данных, что вскрылось только при миграции
3. Скудная документация, полное отсутствие какой-либо поддержки.
7 сен 10, 10:32    [9395315]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
FSS
Member

Откуда: Калининград
Сообщений: 3
[quot NetFantom ,

Ага, а если сюда запостить документацию по PostgreSQL или MySQL? =)
quot]
Был конкретный вопрос, на него был дан конкретный ответ. Помощь оказалось не нужна, может другим это поможет?!
Насчет поддержки. Никто и не претендовал на вселенскую известность. Это и была российская разработка для госпредприятий. Конечным пользователям продукта оказывается прямое "адресное" хорошее сопровождение, мне есть с чем сравнивать.
9 сен 10, 12:14    [9410018]     Ответить | Цитировать Сообщить модератору
 Re: Мерзопакость HyTech и JOIN'ы  [new]
брадобрей
Member

Откуда:
Сообщений: 4698
В век OracleXE и PostgreSQL кто-то юзает такие поделки? жесть какая

хотя было дело, руководил IT департаментом, один старпер мне птался впарить какую-то залипуху на Cache. Я то ему все сказал что думаю про его поделку, так вот думаю ведь другого старпера он мог уговорить. По его словам он это уже несколько раз успешно проделал и поделие стоит в разных конторах.
30 сен 10, 08:06    [9526949]     Ответить | Цитировать Сообщить модератору
Все форумы / Другие СУБД Ответить